--- libavcodec/cfhd.c | 26 ++++++++++++++++++++------ libavcodec/cfhd.h | 2 ++ 2 files changed, 22 insertions(+), 6 deletions(-)
diff --git a/libavcodec/cfhd.c b/libavcodec/cfhd.c index 5c15d9b..c5782a2 100644 --- a/libavcodec/cfhd.c +++ b/libavcodec/cfhd.c @@ -60,6 +60,7 @@ static void init_frame_defaults(CFHDContext *s) { s->coded_width = 0; s->coded_height = 0; + s->coded_format = AV_PIX_FMT_NONE; s->bpc = 10; s->channel_cnt = 4; s->subband_cnt = 10; @@ -156,6 +157,7 @@ static int alloc_buffers(AVCodecContext *avctx) if ((ret = ff_set_dimensions(avctx, s->coded_width, s->coded_height)) < 0) return ret; + avctx->pix_fmt = s->coded_format; avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_x_shift, &s->chroma_y_shift); @@ -213,6 +215,7 @@ static int alloc_buffers(AVCodecContext *avctx) s->a_height = s->coded_height; s->a_width = s->coded_width; + s->a_format = s->coded_format; return 0; } @@ -227,7 +230,7 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame, int ret = 0, i, j, plane, got_buffer = 0; int16_t *coeff_data; - avctx->pix_fmt = AV_PIX_FMT_YUV422P10; + s->coded_format = AV_PIX_FMT_YUV422P10; init_frame_defaults(s); bytestream2_init(&gb, avpkt->data, avpkt->size); @@ -405,9 +408,9 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame, } else if (tag == 84) { av_log(avctx, AV_LOG_DEBUG, "Sample format? %i\n", data); if (data == 1) - avctx->pix_fmt = AV_PIX_FMT_YUV422P10; + s->coded_format = AV_PIX_FMT_YUV422P10; else if (data == 3) - avctx->pix_fmt = AV_PIX_FMT_GBRP12; + s->coded_format = AV_PIX_FMT_GBRP12; else { avpriv_report_missing_feature(avctx, "Sample format of %"PRIu16" is unsupported\n", data); ret = AVERROR_PATCHWELCOME; @@ -417,8 +420,10 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame, av_log(avctx, AV_LOG_DEBUG, "Unknown tag %i data %x\n", tag, data); /* Some kind of end of header tag */ - if (tag == 4 && data == 0x1a4a && s->coded_width && s->coded_height && avctx->pix_fmt != AV_PIX_FMT_NONE) { - if (s->a_width != s->coded_width || s->a_height != s->coded_height) { + if (tag == 4 && data == 0x1a4a && s->coded_width && s->coded_height && + s->coded_format != AV_PIX_FMT_NONE) { + if (s->a_width != s->coded_width || s->a_height != s->coded_height || + s->a_format != s->coded_format) { free_buffers(avctx); if ((ret = alloc_buffers(avctx)) < 0) { free_buffers(avctx); @@ -426,11 +431,19 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame, } } + printf("Prev size = %dx%d, avctx size = %dx%d, this size = %dx%d|%d\n", + s->a_width, s->a_height, + s->avctx->width, s->avctx->height, + s->coded_width, s->coded_height, s->coded_format); if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0) return ret; + printf("Got buffer of size %dx%d, stride=%d/%d, fmt=%d\n", + frame.f->width, frame.f->height, + frame.f->linesize[0], frame.f->linesize[1], frame.f->format); s->coded_width = 0; s->coded_height = 0; + s->coded_format = AV_PIX_FMT_NONE; got_buffer = 1; } coeff_data = s->plane[s->channel_num].subband[s->subband_num_actual]; @@ -557,7 +570,8 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame, } } - if (!s->a_width || !s->a_height || s->coded_width || s->coded_height) { + if (!s->a_width || !s->a_height || s->a_format == AV_PIX_FMT_NONE || + s->coded_width || s->coded_height || s->coded_format != AV_PIX_FMT_NONE) { av_log(avctx, AV_LOG_ERROR, "Invalid dimensions\n"); ret = AVERROR(EINVAL); goto end; diff --git a/libavcodec/cfhd.h b/libavcodec/cfhd.h index a263124..67a0e4c 100644 --- a/libavcodec/cfhd.h +++ b/libavcodec/cfhd.h @@ -84,9 +84,11 @@ typedef struct CFHDContext { int coded_width; int coded_height; + int coded_format; int a_width; int a_height; + int a_format; int bpc; int channel_cnt; -- 2.1.2 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel