[FFmpeg-devel] Patch (1/2) Decoding of Teletext Descriptor (0x56)

JULIAN GARDNER joolzg at btinternet.com
Mon Sep 23 14:25:19 CEST 2013




>________________________________
> From: Clément Bœsch <u at pkh.me>
>To: FFmpeg development discussions and patches <ffmpeg-devel at ffmpeg.org> 
>Sent: Monday, 23 September 2013, 14:21
>Subject: Re: [FFmpeg-devel] Patch (1/2) Decoding of Teletext Descriptor (0x56)
> 
>
>On Mon, Sep 23, 2013 at 11:52:31AM +0100, JULIAN GARDNER wrote:
>> Hope these work, please let me know of any problems
>
>> From 650e40c5e2856656bf2f807ae81a275ee0bc647a Mon Sep 17 00:00:00 2001
>> From: Julian Gardner <joolzg at btinternet.com>
>> Date: Mon, 23 Sep 2013 12:44:41 +0200
>> Subject: [PATCH 2/3] Add in decoding of Teletext Subtitles Descriptor (0x56)
>> 
>> ---
>>  libavformat/mpegts.c | 32 ++++++++++++++++++++++++++------
>>  1 file changed, 26 insertions(+), 6 deletions(-)
>> 
>> diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
>> index 2e438fd..1eab5e2 100644
>> --- a/libavformat/mpegts.c
>> +++ b/libavformat/mpegts.c
>> @@ -1404,7 +1404,7 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type
>>      const uint8_t *desc_end;
>>      int desc_len, desc_tag, desc_es_id;
>>      char language[252];
>> -    int i;
>> +    int i, l;
>>  
>>      desc_tag = get8(pp, desc_list_end);
>>      if (desc_tag < 0)
>> @@ -1457,10 +1457,30 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type
>>          }
>>          break;
>>      case 0x56: /* DVB teletext descriptor */
>> -        language[0] = get8(pp, desc_end);
>> -        language[1] = get8(pp, desc_end);
>> -        language[2] = get8(pp, desc_end);
>> -        language[3] = 0;
>> +        for (i = l = 0; i + 5 <= desc_len; i += 5) {
>> +        int type, mag, page;
>> +        int l0, l1, l2;
>> +        static const char types[] = "RISAPH";
>> +
>> +            l0 = get8(pp, desc_end);
>> +            l1 = get8(pp, desc_end);
>> +            l2 = get8(pp, desc_end);
>> +            type = get8(pp, desc_end);
>> +            page = get8(pp, desc_end);
>> +            if (l<(sizeof( language) - 9)) {
>> +                mag = type;
>> +                type >>= 3;
>> +                if (type < sizeof( types)) {
>> +                    mag &= 7; if (!mag) mag = 8;
>> +                    sprintf( language+l, "%c%c%c,%c%d%02x,", l0, l1,
>> +                        l2, types[ type], mag, page);
>
>use snprintf, the your if don't look safe enougth to me.
>


> +            if (l<(sizeof( language) - 9)) {
Hmm this protects against a buffer overrun


>> +                    l += 9;
>> +                }
>> +            }
>> +        }
>
>> +        if( l) {
>> +            language[ l - 1] = 0;
>> +        }
>
>Is this necessary?


removes last ','

>
>Also, please fix your style it's all broken; indent, random spaces
>inconsistently badly placed, etc.
>
>>          av_dict_set(&st->metadata, "language", language, 0);
>>          break;
>>      case 0x59: /* subtitling descriptor */
>> @@ -1979,7 +1999,7 @@ static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size, co
>>      return 0;
>>  }
>>  


new editor, will check

>
>> -static void finished_reading_packet(AVFormatContext *s, int raw_packet_size)
>> +static inline void finished_reading_packet(AVFormatContext *s, int raw_packet_size)
>
>Why?


that crept in, make code a little faster and shorter


More information about the ffmpeg-devel mailing list