[FFmpeg-devel] [PATCH] cfhd: reallocate internal buffers on format change.
Ronald S. Bultje
rsbultje at gmail.com
Mon Feb 15 16:39:23 CET 2016
---
libavcodec/cfhd.c | 19 +++++++++++++------
libavcodec/cfhd.h | 2 ++
2 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/libavcodec/cfhd.c b/libavcodec/cfhd.c
index 5c15d9b..94cabb8 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);
@@ -431,6 +436,7 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
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 +563,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
More information about the ffmpeg-devel
mailing list