@ -38,6 +38,7 @@ typedef struct DNXHDContext {
BlockDSPContext bdsp ;
int64_t cid ; ///< compression id
unsigned int width , height ;
enum AVPixelFormat pix_fmt ;
unsigned int mb_width , mb_height ;
uint32_t mb_scan_index [ 68 ] ; /* max for 1080p */
int cur_field ; ///< current interlaced field
@ -141,7 +142,7 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame,
ctx - > is_444 = 0 ;
if ( buf [ 0x4 ] = = 0x2 ) {
ctx - > avctx - > pix_fmt = AV_PIX_FMT_YUV444P10 ;
ctx - > pix_fmt = AV_PIX_FMT_YUV444P10 ;
ctx - > avctx - > bits_per_raw_sample = 10 ;
if ( ctx - > bit_depth ! = 10 ) {
ff_blockdsp_init ( & ctx - > bdsp , ctx - > avctx ) ;
@ -151,7 +152,7 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame,
}
ctx - > is_444 = 1 ;
} else if ( buf [ 0x21 ] & 0x40 ) {
ctx - > avctx - > pix_fmt = AV_PIX_FMT_YUV422P10 ;
ctx - > pix_fmt = AV_PIX_FMT_YUV422P10 ;
ctx - > avctx - > bits_per_raw_sample = 10 ;
if ( ctx - > bit_depth ! = 10 ) {
ff_blockdsp_init ( & ctx - > bdsp , ctx - > avctx ) ;
@ -160,7 +161,7 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame,
ctx - > decode_dct_block = dnxhd_decode_dct_block_10 ;
}
} else {
ctx - > avctx - > pix_fmt = AV_PIX_FMT_YUV422P ;
ctx - > pix_fmt = AV_PIX_FMT_YUV422P ;
ctx - > avctx - > bits_per_raw_sample = 8 ;
if ( ctx - > bit_depth ! = 8 ) {
ff_blockdsp_init ( & ctx - > bdsp , ctx - > avctx ) ;
@ -446,7 +447,13 @@ decode_coding_unit:
avctx - > width , avctx - > height , ctx - > width , ctx - > height ) ;
first_field = 1 ;
}
if ( avctx - > pix_fmt ! = AV_PIX_FMT_NONE & & avctx - > pix_fmt ! = ctx - > pix_fmt ) {
av_log ( avctx , AV_LOG_WARNING , " pix_fmt changed: %s -> %s \n " ,
av_get_pix_fmt_name ( avctx - > pix_fmt ) , av_get_pix_fmt_name ( ctx - > pix_fmt ) ) ;
first_field = 1 ;
}
avctx - > pix_fmt = ctx - > pix_fmt ;
ret = ff_set_dimensions ( avctx , ctx - > width , ctx - > height ) ;
if ( ret < 0 )
return ret ;