[FFmpeg-devel] [PATCH] a couple of updates for MPEGTS

Måns Rullgård mans
Sun Feb 17 15:49:05 CET 2008


Nico Sabbi <Nicola.Sabbi at poste.it> writes:

> Il Tuesday 12 February 2008 23:36:59 Nico Sabbi ha scritto:
>> 
>> M?ns Rullg?rd wrote:
>> >> In incoming there are a couple of interesting samples: one is a trailer
>> >> of resident evil that uses 0x82 as stream_type to identify DCA
>> >> (I don't know in what system this mapping is defined) ;
>> 
>> >I'd obviously like to know what system uses this value.  The sample
>> >has a Bluray registration descriptor, so it maybe that is where it
>> >comes from.  The PS3 refuses to recognise any audio in the file, but
>> >that need not mean anything.
>> >
>> >Otherwise I have only the standard objection about non-standard
>> >features.  Randomly assigning codes in the private range to codecs
>> >will sooner or later lead to a clash.  In this case, the registration
>> >descriptor could probably be used to identify the codec mapping in a
>> >safer manner.  It's hard to say for sure without access to the Bluray
>> >spec.
>> >
>> >Given the amount of work required to implement this properly, and that
>> >we so far only have this sample using stream type 0x82, I reckon we
>> >can still add this to the list.
>> 
>> I'll post tomorrow the patch to parse the program descriptors.
>> let's make it better now and don't regret in the future
>
> Index: libavformat/mpegts.c
> ===================================================================
> --- libavformat/mpegts.c	(revisione 12129)
> +++ libavformat/mpegts.c	(copia locale)
> @@ -478,6 +478,7 @@
>      int desc_list_len, desc_len, desc_tag;
>      int comp_page = 0, anc_page = 0; /* initialize to kill warnings */
>      char language[4] = {0}; /* initialize to kill warnings */
> +    int has_hdmv_descr = 0;

I have an instinctive dislike for things like this.  They tend to
accumulate and become unmanageable.

>  #ifdef DEBUG_SI
>      av_log(ts->stream, AV_LOG_DEBUG, "PMT: len %i\n", section_len);
> @@ -505,7 +506,28 @@
>      program_info_length = get16(&p, p_end) & 0xfff;
>      if (program_info_length < 0)
>          return;
> -    p += program_info_length;
> +    while(program_info_length > 0) {
> +        uint8_t tag, len;
> +        tag = get8(&p, p_end);
> +        len = get8(&p, p_end);
> +        if(len < 0) {

This can never happen.  You (correctly) declared len as unsigned.

> +            //something is broken, exit the program_descriptors_loop
> +            p += program_info_length;
> +            break;
> +        }
> +        program_info_length -= len + 2;
> +        if(tag == 0x5 && len>=4) {

I'd prefer if that 5 were #defined with a descriptive name.

> +            uint8_t bytes[4];
> +            bytes[0] = get8(&p, p_end);
> +            bytes[1] = get8(&p, p_end);
> +            bytes[2] = get8(&p, p_end);
> +            bytes[3] = get8(&p, p_end);
> +            len -= 4;
> +            if(bytes[0] == 'H' && bytes[1] == 'D' && bytes[2] == 'M' && bytes[3] == 'V')
> +                has_hdmv_descr = 1;
> +        }
> +        if(len > 0) p += len;

Useless if() since len is unsigned.

> +    }
>      if (p >= p_end)
>          return;
>      for(;;) {
> @@ -571,6 +593,9 @@
>          }
>          p = desc_list_end;
>  
> +        if(stream_type == 0x82 && has_hdmv_descr)
> +            stream_type = STREAM_TYPE_AUDIO_DTS;

While this will of course work, I don't like it.  The stream_type
value should not be altered based on the registration (or other)
descriptor; only the interpretation should change.

-- 
M?ns Rullg?rd
mans at mansr.com




More information about the ffmpeg-devel mailing list