@ -2082,22 +2082,31 @@ static const struct {
int frame_size ;
int profile ;
uint8_t interlaced ;
int long_gop ; // 1 or 0 when there are separate UIDs for Long GOP and Intra, -1 when Intra/LGOP detection can be ignored
} mxf_h264_codec_uls [ ] = {
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x31 , 0x11 , 0x01 } , 0 , 66 , 0 } , // AVC Baseline, Unconstrained Coding
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x20 , 0x01 } , 0 , 110 , 0 } , // AVC High 10 Intra
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x21 , 0x01 } , 232960 , 0 , 1 } , // AVC Intra 50 1080i60
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x21 , 0x02 } , 281088 , 0 , 1 } , // AVC Intra 50 1080i50
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x21 , 0x03 } , 232960 , 0 , 0 } , // AVC Intra 50 1080p30
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x21 , 0x04 } , 281088 , 0 , 0 } , // AVC Intra 50 1080p25
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x21 , 0x08 } , 116736 , 0 , 0 } , // AVC Intra 50 720p60
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x21 , 0x09 } , 140800 , 0 , 0 } , // AVC Intra 50 720p50
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x30 , 0x01 } , 0 , 122 , 0 } , // AVC High 422 Intra
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x31 , 0x01 } , 472576 , 0 , 1 } , // AVC Intra 100 1080i60
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x31 , 0x02 } , 568832 , 0 , 1 } , // AVC Intra 100 1080i50
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x31 , 0x03 } , 472576 , 0 , 0 } , // AVC Intra 100 1080p30
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x31 , 0x04 } , 568832 , 0 , 0 } , // AVC Intra 100 1080p25
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x31 , 0x08 } , 236544 , 0 , 0 } , // AVC Intra 100 720p60
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x31 , 0x09 } , 284672 , 0 , 0 } , // AVC Intra 100 720p50
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x31 , 0x11 , 0x01 } , 0 , 66 , 0 , - 1 } , // AVC Baseline, Unconstrained Coding
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x31 , 0x20 , 0x01 } , 0 , 77 , 0 , - 1 } , // AVC Main
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x31 , 0x30 , 0x01 } , 0 , 88 , 0 , - 1 } , // AVC Extended
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x31 , 0x40 , 0x01 } , 0 , 100 , 0 , - 1 } , // AVC High
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x31 , 0x50 , 0x01 } , 0 , 110 , 0 , 1 } , // AVC High 10
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x31 , 0x60 , 0x01 } , 0 , 122 , 0 , 1 } , // AVC High 422
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x31 , 0x70 , 0x01 } , 0 , 244 , 0 , 1 } , // AVC High 444
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x20 , 0x01 } , 0 , 110 , 0 , 0 } , // AVC High 10 Intra
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x21 , 0x01 } , 232960 , 0 , 1 , 0 } , // AVC Intra 50 1080i60
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x21 , 0x02 } , 281088 , 0 , 1 , 0 } , // AVC Intra 50 1080i50
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x21 , 0x03 } , 232960 , 0 , 0 , 0 } , // AVC Intra 50 1080p30
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x21 , 0x04 } , 281088 , 0 , 0 , 0 } , // AVC Intra 50 1080p25
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x21 , 0x08 } , 116736 , 0 , 0 , 0 } , // AVC Intra 50 720p60
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x21 , 0x09 } , 140800 , 0 , 0 , 0 } , // AVC Intra 50 720p50
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x30 , 0x01 } , 0 , 122 , 0 , 0 } , // AVC High 422 Intra
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x31 , 0x01 } , 472576 , 0 , 1 , 0 } , // AVC Intra 100 1080i60
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x31 , 0x02 } , 568832 , 0 , 1 , 0 } , // AVC Intra 100 1080i50
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x31 , 0x03 } , 472576 , 0 , 0 , 0 } , // AVC Intra 100 1080p30
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x31 , 0x04 } , 568832 , 0 , 0 , 0 } , // AVC Intra 100 1080p25
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x31 , 0x08 } , 236544 , 0 , 0 , 0 } , // AVC Intra 100 720p60
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0a , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x31 , 0x09 } , 284672 , 0 , 0 , 0 } , // AVC Intra 100 720p50
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0d , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x40 , 0x01 } , 0 , 244 , 0 , 0 } , // AVC High 444 Intra
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x0d , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x32 , 0x50 , 0x01 } , 0 , 44 , 0 , - 1 } , // AVC CAVLC 444
} ;
static int mxf_parse_h264_frame ( AVFormatContext * s , AVStream * st ,
@ -2105,10 +2114,12 @@ static int mxf_parse_h264_frame(AVFormatContext *s, AVStream *st,
{
MXFContext * mxf = s - > priv_data ;
MXFStreamContext * sc = st - > priv_data ;
AVCodecParameters * par = st - > codecpar ;
static const int mxf_h264_num_codec_uls = sizeof ( mxf_h264_codec_uls ) / sizeof ( mxf_h264_codec_uls [ 0 ] ) ;
const uint8_t * buf = pkt - > data ;
const uint8_t * buf_end = pkt - > data + pkt - > size ;
uint32_t state = - 1 ;
int long_gop = 0 ; // assume intra when there is no SPS header
int extra_size = 512 ; // support AVC Intra files without SPS/PPS header
int i , frame_size ;
uint8_t uid_found ;
@ -2123,7 +2134,8 @@ static int mxf_parse_h264_frame(AVFormatContext *s, AVStream *st,
- - buf ;
switch ( state & 0x1f ) {
case H264_NAL_SPS :
st - > codecpar - > profile = buf [ 1 ] ;
par - > profile = buf [ 1 ] ;
long_gop = buf [ 2 ] & 0x10 ? 0 : 1 ; // constraint_set3_flag signals intra
e - > flags | = 0x40 ;
break ;
case H264_NAL_PPS :
@ -2142,25 +2154,27 @@ static int mxf_parse_h264_frame(AVFormatContext *s, AVStream *st,
return 1 ;
sc - > aspect_ratio = ( AVRational ) { 16 , 9 } ; // 16:9 is mandatory for broadcast HD
sc - > component_depth = 10 ; // AVC Intra is always 10 Bit
sc - > interlaced = st - > codecpar - > field_order ! = AV_FIELD_PROGRESSIVE ? 1 : 0 ;
if ( sc - > interlaced )
sc - > field_dominance = 1 ; // top field first is mandatory for AVC Intra
sc - > interlaced = par - > field_order ! = AV_FIELD_PROGRESSIVE ? 1 : 0 ;
uid_found = 0 ;
frame_size = pkt - > size + extra_size ;
for ( i = 0 ; i < mxf_h264_num_codec_uls ; i + + ) {
if ( frame_size = = mxf_h264_codec_uls [ i ] . frame_size & & sc - > interlaced = = mxf_h264_codec_uls [ i ] . interlaced ) {
sc - > codec_ul = & mxf_h264_codec_uls [ i ] . uid ;
sc - > component_depth = 10 ; // AVC Intra is always 10 Bit
if ( sc - > interlaced )
sc - > field_dominance = 1 ; // top field first is mandatory for AVC Intra
return 1 ;
} else if ( st - > codecpar - > profile = = mxf_h264_codec_uls [ i ] . profile ) {
} else if ( ( mxf_h264_codec_uls [ i ] . profile = = par - > profile ) & &
( ( mxf_h264_codec_uls [ i ] . long_gop < 0 ) | |
( mxf_h264_codec_uls [ i ] . long_gop = = long_gop ) ) ) {
sc - > codec_ul = & mxf_h264_codec_uls [ i ] . uid ;
uid_found = 1 ;
}
}
if ( ! uid_found ) {
av_log ( s , AV_LOG_ERROR , " AVC Intra 50/100 supported only \n " ) ;
av_log ( s , AV_LOG_ERROR , " h264 profile not supported \n " ) ;
return 0 ;
}