@ -39,10 +39,12 @@
# include "libavutil/random_seed.h"
# include "libavutil/timecode.h"
# include "libavcodec/bytestream.h"
# include "libavcodec/dnxhddata.h"
# include "audiointerleave.h"
# include "avformat.h"
# include "internal.h"
# include "mxf.h"
# include "config.h"
static const int NTSC_samples_per_frame [ ] = { 1602 , 1601 , 1602 , 1601 , 1602 , 0 } ;
static const int NTSC_60_samples_per_frame [ ] = { 801 , 801 , 801 , 801 , 800 , 0 } ;
@ -74,6 +76,7 @@ typedef struct {
int order ; ///< interleaving order if dts are equal
int interlaced ; ///< whether picture is interlaced
int field_dominance ; ///< tff=1, bff=2
int component_depth ;
int temporal_reordering ;
AVRational aspect_ratio ; ///< display aspect ratio
int closed_gop ; ///< gop is closed, used in mpeg-2 frame parsing
@ -93,6 +96,8 @@ static const struct {
{ CODEC_ID_MPEG2VIDEO , 0 } ,
{ CODEC_ID_PCM_S24LE , 1 } ,
{ CODEC_ID_PCM_S16LE , 1 } ,
{ CODEC_ID_DVVIDEO , 15 } ,
{ CODEC_ID_DNXHD , 24 } ,
{ CODEC_ID_NONE }
} ;
@ -169,6 +174,101 @@ static const MXFContainerEssenceEntry mxf_essence_container_uls[] = {
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x06 , 0x01 , 0x10 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x02 , 0x02 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 } ,
mxf_write_generic_sound_desc } ,
// DV Unknwon
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x02 , 0x02 , 0x7F , 0x01 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x18 , 0x01 , 0x01 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x02 , 0x00 , 0x00 , 0x00 } ,
mxf_write_cdci_desc } ,
// DV25 525/60
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x02 , 0x02 , 0x40 , 0x01 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x18 , 0x01 , 0x01 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x02 , 0x02 , 0x01 , 0x00 } ,
mxf_write_cdci_desc } ,
// DV25 625/50
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x02 , 0x02 , 0x41 , 0x01 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x18 , 0x01 , 0x01 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x02 , 0x02 , 0x02 , 0x00 } ,
mxf_write_cdci_desc } ,
// DV50 525/60
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x02 , 0x02 , 0x50 , 0x01 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x18 , 0x01 , 0x01 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x02 , 0x02 , 0x03 , 0x00 } ,
mxf_write_cdci_desc } ,
// DV50 625/50
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x02 , 0x02 , 0x51 , 0x01 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x18 , 0x01 , 0x01 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x02 , 0x02 , 0x04 , 0x00 } ,
mxf_write_cdci_desc } ,
// DV100 1080/60
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x02 , 0x02 , 0x60 , 0x01 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x18 , 0x01 , 0x01 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x02 , 0x02 , 0x05 , 0x00 } ,
mxf_write_cdci_desc } ,
// DV100 1080/50
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x02 , 0x02 , 0x61 , 0x01 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x18 , 0x01 , 0x01 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x02 , 0x02 , 0x06 , 0x00 } ,
mxf_write_cdci_desc } ,
// DV100 720/60
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x02 , 0x02 , 0x62 , 0x01 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x18 , 0x01 , 0x01 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x02 , 0x02 , 0x07 , 0x00 } ,
mxf_write_cdci_desc } ,
// DV100 720/50
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x02 , 0x02 , 0x63 , 0x01 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x18 , 0x01 , 0x01 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x02 , 0x02 , 0x08 , 0x00 } ,
mxf_write_cdci_desc } ,
// DNxHD 1080p 10bit high
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x02 , 0x11 , 0x01 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x15 , 0x01 , 0x05 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x71 , 0x01 , 0x00 , 0x00 } ,
mxf_write_cdci_desc } ,
// DNxHD 1080p 8bit medium
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x02 , 0x11 , 0x01 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x15 , 0x01 , 0x05 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x71 , 0x03 , 0x00 , 0x00 } ,
mxf_write_cdci_desc } ,
// DNxHD 1080p 8bit high
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x02 , 0x11 , 0x01 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x15 , 0x01 , 0x05 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x71 , 0x04 , 0x00 , 0x00 } ,
mxf_write_cdci_desc } ,
// DNxHD 1080i 10bit high
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x02 , 0x11 , 0x01 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x15 , 0x01 , 0x05 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x71 , 0x07 , 0x00 , 0x00 } ,
mxf_write_cdci_desc } ,
// DNxHD 1080i 8bit medium
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x02 , 0x11 , 0x01 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x15 , 0x01 , 0x05 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x71 , 0x08 , 0x00 , 0x00 } ,
mxf_write_cdci_desc } ,
// DNxHD 1080i 8bit high
{ { 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x02 , 0x11 , 0x01 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0D , 0x01 , 0x03 , 0x01 , 0x15 , 0x01 , 0x05 , 0x00 } ,
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x71 , 0x09 , 0x00 , 0x00 } ,
mxf_write_cdci_desc } ,
// DNxHD 720p 10bit
{ { 0x06 , 0x0e , 0x2b , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0d , 0x01 , 0x03 , 0x01 , 0x02 , 0x11 , 0x01 , 0x00 } ,
{ 0x06 , 0x0e , 0x2b , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0d , 0x01 , 0x03 , 0x01 , 0x15 , 0x01 , 0x05 , 0x00 } ,
{ 0x06 , 0x0e , 0x2b , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x71 , 0x10 , 0x00 , 0x00 } ,
mxf_write_cdci_desc } ,
// DNxHD 720p 8bit high
{ { 0x06 , 0x0e , 0x2b , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0d , 0x01 , 0x03 , 0x01 , 0x02 , 0x11 , 0x01 , 0x00 } ,
{ 0x06 , 0x0e , 0x2b , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0d , 0x01 , 0x03 , 0x01 , 0x15 , 0x01 , 0x05 , 0x00 } ,
{ 0x06 , 0x0e , 0x2b , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x71 , 0x11 , 0x00 , 0x00 } ,
mxf_write_cdci_desc } ,
// DNxHD 720p 8bit medium
{ { 0x06 , 0x0e , 0x2b , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0d , 0x01 , 0x03 , 0x01 , 0x02 , 0x11 , 0x01 , 0x00 } ,
{ 0x06 , 0x0e , 0x2b , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0d , 0x01 , 0x03 , 0x01 , 0x15 , 0x01 , 0x05 , 0x00 } ,
{ 0x06 , 0x0e , 0x2b , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x71 , 0x12 , 0x00 , 0x00 } ,
mxf_write_cdci_desc } ,
// DNxHD 720p 8bit low
{ { 0x06 , 0x0e , 0x2b , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x0d , 0x01 , 0x03 , 0x01 , 0x02 , 0x11 , 0x01 , 0x00 } ,
{ 0x06 , 0x0e , 0x2b , 0x34 , 0x01 , 0x02 , 0x01 , 0x01 , 0x0d , 0x01 , 0x03 , 0x01 , 0x15 , 0x01 , 0x05 , 0x00 } ,
{ 0x06 , 0x0e , 0x2b , 0x34 , 0x04 , 0x01 , 0x01 , 0x01 , 0x04 , 0x01 , 0x02 , 0x02 , 0x71 , 0x13 , 0x00 , 0x00 } ,
mxf_write_cdci_desc } ,
{ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 } ,
{ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 } ,
{ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 } ,
@ -818,7 +918,7 @@ static void mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID ke
// component depth
mxf_write_local_tag ( pb , 4 , 0x3301 ) ;
avio_wb32 ( pb , 8 ) ;
avio_wb32 ( pb , sc - > component_depth ) ;
// horizontal subsampling
mxf_write_local_tag ( pb , 4 , 0x3302 ) ;
@ -830,9 +930,9 @@ static void mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID ke
// video line map
switch ( st - > codec - > height ) {
case 576 : f1 = 23 ; f2 = 336 ; break ;
case 576 : f1 = 23 ; f2 = st - > codec - > codec_id = = CODEC_ID_DVVIDEO ? 335 : 336 ; break ;
case 608 : f1 = 7 ; f2 = 320 ; break ;
case 480 : f1 = 20 ; f2 = 283 ; break ;
case 480 : f1 = 20 ; f2 = st - > codec - > codec_id = = CODEC_ID_DVVIDEO ? 285 : 283 ; break ;
case 512 : f1 = 7 ; f2 = 270 ; break ;
case 720 : f1 = 26 ; f2 = 0 ; break ; // progressive
case 1080 : f1 = 21 ; f2 = 584 ; break ;
@ -1291,6 +1391,153 @@ static void mxf_write_partition(AVFormatContext *s, int bodysid,
avio_flush ( pb ) ;
}
static int mxf_parse_dnxhd_frame ( AVFormatContext * s , AVStream * st ,
AVPacket * pkt )
{
MXFContext * mxf = s - > priv_data ;
MXFStreamContext * sc = st - > priv_data ;
int i , cid ;
uint8_t * header_cid ;
unsigned int frame_size = 0 ;
if ( mxf - > header_written )
return 1 ;
if ( pkt - > size < 43 )
return - 1 ;
header_cid = pkt - > data + 0x28 ;
cid = header_cid [ 0 ] < < 24 | header_cid [ 1 ] < < 16 | header_cid [ 2 ] < < 8 | header_cid [ 3 ] ;
if ( ( i = ff_dnxhd_get_cid_table ( cid ) ) < 0 )
return - 1 ;
switch ( cid ) {
case 1235 :
sc - > index = 24 ;
sc - > component_depth = 10 ;
break ;
case 1237 :
sc - > index = 25 ;
break ;
case 1238 :
sc - > index = 26 ;
break ;
case 1241 :
sc - > index = 27 ;
sc - > component_depth = 10 ;
break ;
case 1242 :
sc - > index = 28 ;
break ;
case 1243 :
sc - > index = 29 ;
break ;
case 1250 :
sc - > index = 30 ;
sc - > component_depth = 10 ;
break ;
case 1251 :
sc - > index = 31 ;
break ;
case 1252 :
sc - > index = 32 ;
break ;
case 1253 :
sc - > index = 33 ;
break ;
default :
return - 1 ;
}
frame_size = ff_dnxhd_cid_table [ i ] . frame_size ;
mxf - > edit_unit_byte_count = KAG_SIZE ;
for ( i = 0 ; i < s - > nb_streams ; i + + ) {
AVStream * st = s - > streams [ i ] ;
MXFStreamContext * sc = st - > priv_data ;
if ( st - > codec - > codec_type = = AVMEDIA_TYPE_AUDIO ) {
mxf - > edit_unit_byte_count + = 16 + 4 + sc - > aic . samples [ 0 ] * sc - > aic . sample_size ;
mxf - > edit_unit_byte_count + = klv_fill_size ( mxf - > edit_unit_byte_count ) ;
} else if ( st - > codec - > codec_type = = AVMEDIA_TYPE_VIDEO ) {
mxf - > edit_unit_byte_count + = 16 + 4 + frame_size ;
mxf - > edit_unit_byte_count + = klv_fill_size ( mxf - > edit_unit_byte_count ) ;
}
}
return 1 ;
}
static int mxf_parse_dv_frame ( AVFormatContext * s , AVStream * st , AVPacket * pkt )
{
MXFContext * mxf = s - > priv_data ;
MXFStreamContext * sc = st - > priv_data ;
uint8_t * vs_pack , * vsc_pack ;
int i , ul_index , frame_size , stype , pal ;
if ( mxf - > header_written )
return 1 ;
// Check for minimal frame size
if ( pkt - > size < 120000 )
return - 1 ;
vs_pack = pkt - > data + 80 * 5 + 48 ;
vsc_pack = pkt - > data + 80 * 5 + 53 ;
stype = vs_pack [ 3 ] & 0x1f ;
pal = ( vs_pack [ 3 ] > > 5 ) & 0x1 ;
if ( ( vs_pack [ 2 ] & 0x07 ) = = 0x02 )
sc - > aspect_ratio = ( AVRational ) { 16 , 9 } ;
else
sc - > aspect_ratio = ( AVRational ) { 4 , 3 } ;
sc - > interlaced = ( vsc_pack [ 3 ] > > 4 ) & 0x01 ;
// TODO: fix dv encoder to set proper FF/FS value in VSC pack
// and set field dominance accordingly
// av_log(s, AV_LOG_DEBUG, "DV vsc pack ff/ss = %x\n", vsc_pack[2] >> 6);
switch ( stype ) {
case 0x18 : // DV100 720p
ul_index = 6 + pal ;
frame_size = pal ? 288000 : 240000 ;
if ( sc - > interlaced ) {
av_log ( s , AV_LOG_ERROR , " source marked as interlaced but codec profile is progressive " ) ;
sc - > interlaced = 0 ;
}
break ;
case 0x14 : // DV100 1080i
ul_index = 4 + pal ;
frame_size = pal ? 576000 : 480000 ;
break ;
case 0x04 : // DV50
ul_index = 2 + pal ;
frame_size = pal ? 288000 : 240000 ;
break ;
default : // DV25
ul_index = 0 + pal ;
frame_size = pal ? 144000 : 120000 ;
}
sc - > index = ul_index + 16 ;
sc - > codec_ul = & mxf_essence_container_uls [ sc - > index ] . codec_ul ;
mxf - > edit_unit_byte_count = KAG_SIZE ;
for ( i = 0 ; i < s - > nb_streams ; i + + ) {
AVStream * st = s - > streams [ i ] ;
MXFStreamContext * sc = st - > priv_data ;
if ( st - > codec - > codec_type = = AVMEDIA_TYPE_AUDIO ) {
mxf - > edit_unit_byte_count + = 16 + 4 + sc - > aic . samples [ 0 ] * sc - > aic . sample_size ;
mxf - > edit_unit_byte_count + = klv_fill_size ( mxf - > edit_unit_byte_count ) ;
} else if ( st - > codec - > codec_type = = AVMEDIA_TYPE_VIDEO ) {
mxf - > edit_unit_byte_count + = 16 + 4 + frame_size ;
mxf - > edit_unit_byte_count + = klv_fill_size ( mxf - > edit_unit_byte_count ) ;
}
}
return 1 ;
}
static const UID mxf_mpeg2_codec_uls [ ] = {
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x03 , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x01 , 0x10 , 0x00 } , // MP-ML I-Frame
{ 0x06 , 0x0E , 0x2B , 0x34 , 0x04 , 0x01 , 0x01 , 0x03 , 0x04 , 0x01 , 0x02 , 0x02 , 0x01 , 0x01 , 0x11 , 0x00 } , // MP-ML Long GOP
@ -1434,6 +1681,8 @@ static int mxf_write_header(AVFormatContext *s)
if ( st - > codec - > codec_type = = AVMEDIA_TYPE_VIDEO ) {
AVRational rate ;
// Default component depth to 8
sc - > component_depth = 8 ;
if ( fabs ( av_q2d ( st - > codec - > time_base ) - 1 / 25.0 ) < 0.0001 ) {
samples_per_frame = PAL_samples_per_frame ;
mxf - > time_base = ( AVRational ) { 1 , 25 } ;
@ -1537,7 +1786,10 @@ static int mxf_write_header(AVFormatContext *s)
MXFStreamContext * sc = s - > streams [ i ] - > priv_data ;
// update element count
sc - > track_essence_element_key [ 13 ] = present [ sc - > index ] ;
sc - > order = AV_RB32 ( sc - > track_essence_element_key + 12 ) ;
if ( ! memcmp ( sc - > track_essence_element_key , mxf_essence_container_uls [ 15 ] . element_ul , 13 ) ) // DV
sc - > order = ( 0x15 < < 24 ) | AV_RB32 ( sc - > track_essence_element_key + 13 ) ;
else
sc - > order = AV_RB32 ( sc - > track_essence_element_key + 12 ) ;
}
if ( t = av_dict_get ( s - > metadata , " creation_time " , NULL , 0 ) )
@ -1691,6 +1943,16 @@ static int mxf_write_packet(AVFormatContext *s, AVPacket *pkt)
av_log ( s , AV_LOG_ERROR , " could not get mpeg2 profile and level \n " ) ;
return - 1 ;
}
} else if ( st - > codec - > codec_id = = CODEC_ID_DNXHD ) {
if ( ! mxf_parse_dnxhd_frame ( s , st , pkt ) ) {
av_log ( s , AV_LOG_ERROR , " could not get dnxhd profile \n " ) ;
return - 1 ;
}
} else if ( st - > codec - > codec_id = = CODEC_ID_DVVIDEO ) {
if ( ! mxf_parse_dv_frame ( s , st , pkt ) ) {
av_log ( s , AV_LOG_ERROR , " could not get dv profile \n " ) ;
return - 1 ;
}
}
if ( ! mxf - > header_written ) {