[FFmpeg-devel] [PATCH] Encapsulate Dirac in MPEG TS.

Benoit Fouet benoit.fouet
Wed Jul 16 09:31:33 CEST 2008


Hi,

Anuradha Suraparaju wrote:
> On Wed, 2008-05-07 at 09:28 +0100, M?ns Rullg?rd wrote:
>   
>> Nico Sabbi <Nicola.Sabbi at poste.it> writes:
>>
>>     
>>> On Wednesday 07 May 2008 05:51:17 Anuradha Suraparaju wrote:
>>>       
>>>> I've attached a patch to the latest FFmpeg trunk revsion 13071 to
>>>> wrap Dirac in MPEG Transport Streams. The encapsulation has been
>>>> done is accordance with the draft document
>>>>
>>>> http://schrodinger.sourceforge.net/dirac-in-13818-1-mapping.pdf
>>>>
>>>> Regards,
>>>> Anuradha
>>>>         
>>> minor nit: that draft specifies the use of a registration descriptor
>>> with payload 'drac', but it doesn't mention if that value was actually
>>> sanctioned by ISO
>>>       
>> It's not on the official list:
>> http://www.smpte-ra.org/mpegreg/mpegreg.html
>>
>>     
>
> Format_identifier 'drac' is now officially registered.
> http://smpte-ra.org/mpegreg/drac.html
>
> I recreated the patch to use the latest trunk source. I have also
> modified the Dirac detection code to use the registration descriptor. 
>
> Regards,
> Anuradha
>   
> ------------------------------------------------------------------------
>
> Index: libavformat/mpegts.c
> ===================================================================
> --- libavformat/mpegts.c	(revision 14255)
> +++ libavformat/mpegts.c	(working copy)
> @@ -482,6 +482,7 @@
>      int comp_page = 0, anc_page = 0; /* initialize to kill warnings */
>      char language[4] = {0}; /* initialize to kill warnings */
>      int has_hdmv_descr = 0;
> +    int has_dirac_descr = 0;
>  
>  #ifdef DEBUG_SI
>      av_log(ts->stream, AV_LOG_DEBUG, "PMT: len %i\n", section_len);
> @@ -589,6 +590,18 @@
>                  language[2] = get8(&p, desc_end);
>                  language[3] = 0;
>                  break;
> +            case REGISTRATION_DESCRIPTOR: /*MPEG-2 Registration descriptor */
> +                if (desc_len >= 4) {
>   

this check seems unneeded.

> +                    uint8_t bytes[4];
> +                    bytes[0] = get8(&p, desc_end);
> +                    bytes[1] = get8(&p, desc_end);
> +                    bytes[2] = get8(&p, desc_end);
> +                    bytes[3] = get8(&p, desc_end);
> +                    if(bytes[0] == 'd' && bytes[1] == 'r' &&
> +                       bytes[2] == 'a' && bytes[3] == 'c')
> +                        has_dirac_descr = 1;
> +                }
> +                break;
>              default:
>                  break;
>              }
> @@ -610,12 +623,14 @@
>          case STREAM_TYPE_VIDEO_MPEG4:
>          case STREAM_TYPE_VIDEO_H264:
>          case STREAM_TYPE_VIDEO_VC1:
> +        case STREAM_TYPE_VIDEO_DIRAC:
>          case STREAM_TYPE_AUDIO_AAC:
>          case STREAM_TYPE_AUDIO_AC3:
>          case STREAM_TYPE_AUDIO_DTS:
>          case STREAM_TYPE_AUDIO_HDMV_DTS:
>          case STREAM_TYPE_SUBTITLE_DVB:
> -            if(stream_type == STREAM_TYPE_AUDIO_HDMV_DTS && !has_hdmv_descr)
> +            if((stream_type == STREAM_TYPE_AUDIO_HDMV_DTS && !has_hdmv_descr)
> +            || (stream_type == STREAM_TYPE_VIDEO_DIRAC && !has_dirac_descr))
>   

nit: you can also align the && part

> Index: libavformat/mpegtsenc.c
> ===================================================================
> --- libavformat/mpegtsenc.c	(revision 14255)
> +++ libavformat/mpegtsenc.c	(working copy)
> @@ -220,6 +220,9 @@
>          case CODEC_ID_H264:
>              stream_type = STREAM_TYPE_VIDEO_H264;
>              break;
> +        case CODEC_ID_DIRAC:
> +            stream_type = STREAM_TYPE_VIDEO_DIRAC;
> +            break;
>          case CODEC_ID_MP2:
>          case CODEC_ID_MP3:
>              stream_type = STREAM_TYPE_AUDIO_MPEG1;
> @@ -267,6 +270,16 @@
>                  put16(&q, 1); /* ancillary page id */
>              }
>              break;
> +        case CODEC_TYPE_VIDEO:
> +            if (stream_type == STREAM_TYPE_VIDEO_DIRAC) {
> +                *q++ = 0x05; /*MPEG-2 registration descriptor*/
> +                *q++ = 4;
> +                *q++ = 0x64; /* drac */
> +                *q++ = 0x72;
> +                *q++ = 0x61;
> +                *q++ = 0x63;
>   

you wouldn't need this comment if you were using 'd', 'r', ...

> +            }
> +            break;
>          }
>  
>          val = 0xf000 | (q - desc_length_ptr - 2);
> @@ -486,6 +499,7 @@
>      uint8_t buf[TS_PACKET_SIZE];
>      uint8_t *q;
>      int val, is_start, len, header_len, write_pcr, private_code, flags;
> +    int pes_extension = 0;
>   

this declaration could be moved to where it is used.

>      int afc_len, stuffing_len;
>      int64_t pcr = -1; /* avoid warning */
>  
> @@ -533,7 +547,10 @@
>              *q++ = 0x01;
>              private_code = 0;
>              if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
> -                *q++ = 0xe0;
> +                if (st->codec->codec_id == CODEC_ID_DIRAC) {
> +                    *q++ = 0xfd;
> +                } else
> +                    *q++ = 0xe0;
>              } else if (st->codec->codec_type == CODEC_TYPE_AUDIO &&
>                         (st->codec->codec_id == CODEC_ID_MP2 ||
>                          st->codec->codec_id == CODEC_ID_MP3)) {
> @@ -554,6 +571,19 @@
>                  header_len += 5;
>                  flags |= 0x40;
>              }
> +            if (st->codec->codec_type == CODEC_TYPE_VIDEO &&
> +                st->codec->codec_id == CODEC_ID_DIRAC) {
> +                /* set PES_extension_flag */
> +                pes_extension = 1;
> +                flags |= 0x01;
> +
> +                /*
> +                * One byte for PES2 extension flag +
> +                * one byte for extension length +
> +                * one byte for extension id
> +                */
> +                header_len += 3;
> +            }
>              len = payload_size + header_len + 3;
>              if (private_code != 0)
>                  len++;
> @@ -574,6 +604,16 @@
>                  write_pts(q, 1, dts);
>                  q += 5;
>              }
> +            if (pes_extension && st->codec->codec_id == CODEC_ID_DIRAC) {
> +                flags = 0x01;  /* set PES_extension_flag_2 */
> +                *q++ = flags;
> +                *q++ = 0x80 | 0x01;  /* marker bit + extension length */
> +                /*
> +                * Set the stream id extension flag bit to 0 and
> +                * write the extended stream id
> +                */
> +                *q++ = 0x00 | 0x60;
> +            }
>              if (private_code != 0)
>                  *q++ = private_code;
>              is_start = 0;
>   

-- 
Benoit Fouet
Purple Labs S.A.
www.purplelabs.com




More information about the ffmpeg-devel mailing list