[FFmpeg-cvslog] avcodec/utvideodec: Set pro flag based on fourcc

2018-04-12 Thread Michael Niedermayer
ffmpeg | branch: release/3.3 | Michael Niedermayer  | 
Sat Mar 31 03:10:43 2018 +0200| [15d4dc0da1e9f2450b5f9e748e1704fc0e6ef3a4] | 
committer: Michael Niedermayer

avcodec/utvideodec: Set pro flag based on fourcc

This avoids mixing 8bit variants with pro and 10bit with non pro mode.
Fixes: out of array read
Fixes: poc_03_30.avi

Found-by: GwanYeong Kim 
Reviewed-by: Paul B Mahol 
Signed-off-by: Michael Niedermayer 
(cherry picked from commit 47b7c68ae54560e2308bdb6be4fb076c73b93081)
Signed-off-by: Michael Niedermayer 

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=15d4dc0da1e9f2450b5f9e748e1704fc0e6ef3a4
---

 libavcodec/utvideodec.c | 64 +
 1 file changed, 33 insertions(+), 31 deletions(-)

diff --git a/libavcodec/utvideodec.c b/libavcodec/utvideodec.c
index 2cf9ce2855..50dede6de3 100644
--- a/libavcodec/utvideodec.c
+++ b/libavcodec/utvideodec.c
@@ -832,37 +832,6 @@ static av_cold int decode_init(AVCodecContext *avctx)
 ff_bswapdsp_init(>bdsp);
 ff_llviddsp_init(>llviddsp);
 
-if (avctx->extradata_size >= 16) {
-av_log(avctx, AV_LOG_DEBUG, "Encoder version %d.%d.%d.%d\n",
-   avctx->extradata[3], avctx->extradata[2],
-   avctx->extradata[1], avctx->extradata[0]);
-av_log(avctx, AV_LOG_DEBUG, "Original format %"PRIX32"\n",
-   AV_RB32(avctx->extradata + 4));
-c->frame_info_size = AV_RL32(avctx->extradata + 8);
-c->flags   = AV_RL32(avctx->extradata + 12);
-
-if (c->frame_info_size != 4)
-avpriv_request_sample(avctx, "Frame info not 4 bytes");
-av_log(avctx, AV_LOG_DEBUG, "Encoding parameters %08"PRIX32"\n", 
c->flags);
-c->slices  = (c->flags >> 24) + 1;
-c->compression = c->flags & 1;
-c->interlaced  = c->flags & 0x800;
-} else if (avctx->extradata_size == 8) {
-av_log(avctx, AV_LOG_DEBUG, "Encoder version %d.%d.%d.%d\n",
-   avctx->extradata[3], avctx->extradata[2],
-   avctx->extradata[1], avctx->extradata[0]);
-av_log(avctx, AV_LOG_DEBUG, "Original format %"PRIX32"\n",
-   AV_RB32(avctx->extradata + 4));
-c->interlaced  = 0;
-c->pro = 1;
-c->frame_info_size = 4;
-} else {
-av_log(avctx, AV_LOG_ERROR,
-   "Insufficient extradata size %d, should be at least 16\n",
-   avctx->extradata_size);
-return AVERROR_INVALIDDATA;
-}
-
 c->slice_bits_size = 0;
 
 switch (avctx->codec_tag) {
@@ -891,14 +860,17 @@ static av_cold int decode_init(AVCodecContext *avctx)
 break;
 case MKTAG('U', 'Q', 'Y', '2'):
 c->planes  = 3;
+c->pro = 1;
 avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
 break;
 case MKTAG('U', 'Q', 'R', 'G'):
 c->planes  = 3;
+c->pro = 1;
 avctx->pix_fmt = AV_PIX_FMT_GBRP10;
 break;
 case MKTAG('U', 'Q', 'R', 'A'):
 c->planes  = 4;
+c->pro = 1;
 avctx->pix_fmt = AV_PIX_FMT_GBRAP10;
 break;
 case MKTAG('U', 'L', 'H', '0'):
@@ -929,6 +901,36 @@ static av_cold int decode_init(AVCodecContext *avctx)
 return AVERROR_PATCHWELCOME;
 }
 
+if (!c->pro && avctx->extradata_size >= 16) {
+av_log(avctx, AV_LOG_DEBUG, "Encoder version %d.%d.%d.%d\n",
+   avctx->extradata[3], avctx->extradata[2],
+   avctx->extradata[1], avctx->extradata[0]);
+av_log(avctx, AV_LOG_DEBUG, "Original format %"PRIX32"\n",
+   AV_RB32(avctx->extradata + 4));
+c->frame_info_size = AV_RL32(avctx->extradata + 8);
+c->flags   = AV_RL32(avctx->extradata + 12);
+
+if (c->frame_info_size != 4)
+avpriv_request_sample(avctx, "Frame info not 4 bytes");
+av_log(avctx, AV_LOG_DEBUG, "Encoding parameters %08"PRIX32"\n", 
c->flags);
+c->slices  = (c->flags >> 24) + 1;
+c->compression = c->flags & 1;
+c->interlaced  = c->flags & 0x800;
+} else if (c->pro && avctx->extradata_size == 8) {
+av_log(avctx, AV_LOG_DEBUG, "Encoder version %d.%d.%d.%d\n",
+   avctx->extradata[3], avctx->extradata[2],
+   avctx->extradata[1], avctx->extradata[0]);
+av_log(avctx, AV_LOG_DEBUG, "Original format %"PRIX32"\n",
+   AV_RB32(avctx->extradata + 4));
+c->interlaced  = 0;
+c->frame_info_size = 4;
+} else {
+av_log(avctx, AV_LOG_ERROR,
+   "Insufficient extradata size %d, should be at least 16\n",
+   avctx->extradata_size);
+return AVERROR_INVALIDDATA;
+}
+
 return 0;
 }
 

___
ffmpeg-cvslog mailing list
ffmpeg-cvslog@ffmpeg.org

[FFmpeg-cvslog] avcodec/utvideodec: Set pro flag based on fourcc

2018-03-31 Thread Michael Niedermayer
ffmpeg | branch: master | Michael Niedermayer  | Sat 
Mar 31 03:10:43 2018 +0200| [47b7c68ae54560e2308bdb6be4fb076c73b93081] | 
committer: Michael Niedermayer

avcodec/utvideodec: Set pro flag based on fourcc

This avoids mixing 8bit variants with pro and 10bit with non pro mode.
Fixes: out of array read
Fixes: poc_03_30.avi

Found-by: GwanYeong Kim 
Reviewed-by: Paul B Mahol 
Signed-off-by: Michael Niedermayer 

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=47b7c68ae54560e2308bdb6be4fb076c73b93081
---

 libavcodec/utvideodec.c | 8 +---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/libavcodec/utvideodec.c b/libavcodec/utvideodec.c
index 086129d094..82cb038ccd 100644
--- a/libavcodec/utvideodec.c
+++ b/libavcodec/utvideodec.c
@@ -949,14 +949,17 @@ static av_cold int decode_init(AVCodecContext *avctx)
 break;
 case MKTAG('U', 'Q', 'Y', '2'):
 c->planes  = 3;
+c->pro = 1;
 avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
 break;
 case MKTAG('U', 'Q', 'R', 'G'):
 c->planes  = 3;
+c->pro = 1;
 avctx->pix_fmt = AV_PIX_FMT_GBRP10;
 break;
 case MKTAG('U', 'Q', 'R', 'A'):
 c->planes  = 4;
+c->pro = 1;
 avctx->pix_fmt = AV_PIX_FMT_GBRAP10;
 break;
 case MKTAG('U', 'L', 'H', '0'):
@@ -1031,7 +1034,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
 if (c->compression != 2)
 avpriv_request_sample(avctx, "Unknown compression type");
 c->slices  = avctx->extradata[9] + 1;
-} else if (avctx->extradata_size >= 16) {
+} else if (!c->pro && avctx->extradata_size >= 16) {
 av_log(avctx, AV_LOG_DEBUG, "Encoder version %d.%d.%d.%d\n",
avctx->extradata[3], avctx->extradata[2],
avctx->extradata[1], avctx->extradata[0]);
@@ -1046,14 +1049,13 @@ static av_cold int decode_init(AVCodecContext *avctx)
 c->slices  = (c->flags >> 24) + 1;
 c->compression = c->flags & 1;
 c->interlaced  = c->flags & 0x800;
-} else if (avctx->extradata_size == 8) {
+} else if (c->pro && avctx->extradata_size == 8) {
 av_log(avctx, AV_LOG_DEBUG, "Encoder version %d.%d.%d.%d\n",
avctx->extradata[3], avctx->extradata[2],
avctx->extradata[1], avctx->extradata[0]);
 av_log(avctx, AV_LOG_DEBUG, "Original format %"PRIX32"\n",
AV_RB32(avctx->extradata + 4));
 c->interlaced  = 0;
-c->pro = 1;
 c->frame_info_size = 4;
 } else {
 av_log(avctx, AV_LOG_ERROR,

___
ffmpeg-cvslog mailing list
ffmpeg-cvslog@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog