MPEGGroup / FileFormat

MPEG file format discussions
23 stars 0 forks source link

Does iods require Object Descriptors to have ESDescriptors? #90

Open bradh opened 8 months ago

bradh commented 8 months ago

ISO/IEC 14496-14:2020 section 6.2 describes the Object Descriptor Box.

I find this a bit hard to follow, but what I have is that the ObjectDescriptor field is either an OD with a special tag (MP4_OD_Tag) or IOD (MP4_IOD_Tag), and that those are defined in ISO/IEC 14496-1:2010 Section 7.2.6. (There is also a special case for the format of the ES descriptor - see ISO/IEC 14496-14:2020 Section 4.1.3, but I don't think that has direct bearing on the question, which I'll get to, I promise).

In ISO/IEC 14496-1:2010 Section 7.2.6 (and in Annex E.4 of that document, which is a bit easier to follow), there is the syntax for ObjectDescriptor (7.2.6.3.1) and InitialObjectDescriptor (7.2.6.4.1).

The way I read that is that at least one ES_Descriptor is required (the valid number of entries in the array is [1..255]), except for the case where its a URL, which it can't be from the restrictions in 14496-14 Section 4.1.2.

Is that a reasonable reading?

If so, there are several conformance sample files (I think 26 in total) that aren't showing the expected number. Examples:

https://github.com/MPEGGroup/FileFormatConformance/blob/main/data/file_features/published/isobmff/03_hinted_gpac.json#L51

https://github.com/MPEGGroup/FileFormatConformance/blob/main/data/file_features/published/isobmff/21_segment_gpac.json#L72

https://github.com/MPEGGroup/FileFormatConformance/blob/main/data/file_features/published/nalu/l-hevc/mhvc_hvc1_lhv1_multiple_tracks_implicit_gpac.json#L59

cconcolato commented 8 months ago

Thanks for the question.

As you note, the Object Descriptor Framework was introduced as part of MPEG-4 Systems. As of today, very few implementations support it. So, if your goal is to be compliant to ISOBMFF, I would simply remove the iods box.

Regarding the detailed part of your question, I would have to check the specs deeper. @jeanlf may be able to answer faster, especially on the contributed files.

jeanlf commented 8 months ago

The empty IOD was a trick used to signal profile and level of audio or visual stream before the mp4 spec was revised to indicate that the ExtensionProfileLevelDescriptor should be used (annex A of 14496-14). I guess we should patch these files indeed, do you have the complete list ?

bradh commented 8 months ago

I just searched for null Descr entries.

That gave me:

data/file_features/published/isobmff/sg-tl-st_gpac.json:63:          "Descr": null
data/file_features/published/isobmff/18_pssh_v2_gpac.json:56:          "Descr": null
data/file_features/published/isobmff/17_negative_ctso_gpac.json:62:          "Descr": null
data/file_features/published/isobmff/21_segment_gpac.json:72:          "Descr": null
data/file_features/published/isobmff/20_stxt_gpac.json:51:          "Descr": null
data/file_features/published/isobmff/14_large_gpac.json:51:          "Descr": null
data/file_features/published/isobmff/03_hinted_gpac.json:51:          "Descr": null
data/file_features/published/nalu/l-hevc/shvc_hev1_lhe1_multiple_tracks_implicit_gpac.json:59:          "Descr": null
data/file_features/published/nalu/l-hevc/mhvc_hev1_hev2_multiple_tracks_extractors_gpac.json:59:          "Descr": null
data/file_features/published/nalu/l-hevc/shvc_hvc1_lhv1_multiple_tracks_implicit_gpac.json:59:          "Descr": null
data/file_features/published/nalu/l-hevc/lhevc_avc1_lhe1_gpac.json:59:          "Descr": null
data/file_features/published/nalu/l-hevc/mhvc_hvc1_hvc2_multiple_tracks_extractors_gpac.json:59:          "Descr": null
data/file_features/published/nalu/l-hevc/lhevc_avc1_lhv1_gpac.json:59:          "Descr": null
data/file_features/published/nalu/l-hevc/shvc_hvc1_hvc2_multiple_tracks_extractors_gpac.json:59:          "Descr": null
data/file_features/published/nalu/l-hevc/mhvc_hvc1_lhv1_multiple_tracks_implicit_gpac.json:59:          "Descr": null
data/file_features/published/nalu/l-hevc/mhvc_hev1_lhe1_multiple_tracks_implicit_gpac.json:59:          "Descr": null
data/file_features/published/nalu/l-hevc/lhevc_avc3_lhv1_gpac.json:59:          "Descr": null
data/file_features/published/nalu/l-hevc/lhevc_avc3_lhe1_gpac.json:59:          "Descr": null
data/file_features/published/nalu/l-hevc/shvc_hev1_hev2_multiple_tracks_extractors_gpac.json:59:          "Descr": null
data/file_features/published/nalu/hevc/hevc_hev1_hev2_implicit_gpac.json:59:          "Descr": null
data/file_features/published/nalu/hevc/hevc_hev1_hev2_extractors_gpac.json:59:          "Descr": null
data/file_features/published/nalu/hevc/hevc_tiles_multiple_tracks_gpac.json:56:          "Descr": null
data/file_features/published/nalu/hevc/hevc_hvc1_hvc2_extractors_gpac.json:59:          "Descr": null
data/file_features/published/nalu/hevc/hevc_tiles_multiple_tracks_empty_base_gpac.json:56:          "Descr": null
data/file_features/published/nalu/hevc/hevc_hvc1_hvc2_implicit_gpac.json:59:          "Descr": null
data/file_features/published/nalu/mvc/DDF_10s_25fps_gpac.json:63:          "Descr": null
mfuchs-iis commented 3 months ago

Hi all,

I agree that having no descriptors seems to be wrong as described above, however additionally 14496-14, section 6.2.3 (semantics of the 'iods' box) says:

The contents of this box are formed by taking an object descriptor or initial object descriptor and:

  • changing the tag to MP4_OD_Tag or MP4_IOD_Tag as appropriate for this object.
  • replacing the ES descriptors with ES_ID_Inc referencing the appropriate track

So having a ES_ID_Inc pointing to a ES_Descriptor within a 'esds' box in a track seems to be a valid option as well.

The files listed above without any descriptors at all still need fixing I believe.