avcodec/h264_slice: Fix overflow in slice offset
[ffmpeg.git] / libavcodec / cpia.c
index 26e067a..58833b2 100644 (file)
@@ -24,6 +24,7 @@
 
 #include "avcodec.h"
 #include "get_bits.h"
+#include "internal.h"
 
 
 #define FRAME_HEADER_SIZE 64
 
 
 typedef struct {
-    AVFrame frame;
+    AVFrame *frame;
 } CpiaContext;
 
 
-static int cpia_decode_frame(AVCodecContextavctx,
-        void* data, int* data_size, AVPacket* avpkt)
+static int cpia_decode_frame(AVCodecContext *avctx,
+                             void *data, int *got_frame, AVPacket* avpkt)
 {
     CpiaContext* const cpia = avctx->priv_data;
     int i,j,ret;
@@ -58,7 +59,7 @@ static int cpia_decode_frame(AVCodecContext* avctx,
     uint16_t linelength;
     uint8_t skip;
 
-    AVFrame* const frame = &cpia->frame;
+    AVFrame *frame = cpia->frame;
     uint8_t *y, *u, *v, *y_end, *u_end, *v_end;
 
     // Check header
@@ -75,15 +76,15 @@ static int cpia_decode_frame(AVCodecContext* avctx,
 
     // currently unsupported properties
     if (header[17] == SUBSAMPLE_422) {
-        av_log(avctx, AV_LOG_ERROR, "Unsupported subsample!\n");
+        avpriv_report_missing_feature(avctx, "4:2:2 subsampling");
         return AVERROR_PATCHWELCOME;
     }
     if (header[18] == YUVORDER_UYVY) {
-        av_log(avctx, AV_LOG_ERROR, "Unsupported YUV byte order!\n");
+        avpriv_report_missing_feature(avctx, "YUV byte order UYVY");
         return AVERROR_PATCHWELCOME;
     }
     if (header[29] == DECIMATION_ENAB) {
-        av_log(avctx, AV_LOG_ERROR, "Decimation unsupported!\n");
+        avpriv_report_missing_feature(avctx, "Decimation");
         return AVERROR_PATCHWELCOME;
     }
 
@@ -99,10 +100,8 @@ static int cpia_decode_frame(AVCodecContext* avctx,
     }
 
     // Get buffer filled with previous frame
-    if ((ret = avctx->reget_buffer(avctx, frame)) < 0) {
-        av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed!\n");
+    if ((ret = ff_reget_buffer(avctx, frame)) < 0)
         return ret;
-    }
 
 
     for ( i = 0;
@@ -115,7 +114,7 @@ static int cpia_decode_frame(AVCodecContext* avctx,
 
         if (src_size < linelength) {
             frame->decode_error_flags = FF_DECODE_ERROR_INVALID_BITSTREAM;
-            av_log(avctx, AV_LOG_WARNING, "Frame ended enexpectedly!\n");
+            av_log(avctx, AV_LOG_WARNING, "Frame ended unexpectedly!\n");
             break;
         }
         if (src[linelength - 1] != EOL) {
@@ -135,7 +134,7 @@ static int cpia_decode_frame(AVCodecContext* avctx,
         v_end = v + frame->linesize[2] - 1;
 
         if ((i & 1) && header[17] == SUBSAMPLE_420) {
-            /* We are on a odd line and 420 subsample is used.
+            /* We are on an odd line and 420 subsample is used.
              * On this line only Y values are specified, one per pixel.
              */
             for (j = 0; j < linelength - 1; j++) {
@@ -183,14 +182,17 @@ static int cpia_decode_frame(AVCodecContext* avctx,
         }
     }
 
-    *data_size = sizeof(AVFrame);
-    *(AVFrame*) data = *frame;
+    *got_frame = 1;
+    if ((ret = av_frame_ref(data, cpia->frame)) < 0)
+        return ret;
 
     return avpkt->size;
 }
 
 static av_cold int cpia_decode_init(AVCodecContext *avctx)
 {
+    CpiaContext *s = avctx->priv_data;
+
     // output pixel format
     avctx->pix_fmt = AV_PIX_FMT_YUV420P;
 
@@ -202,17 +204,30 @@ static av_cold int cpia_decode_init(AVCodecContext *avctx)
         avctx->time_base.den = 60;
     }
 
+    s->frame = av_frame_alloc();
+    if (!s->frame)
+        return AVERROR(ENOMEM);
+
     return 0;
 }
 
+static av_cold int cpia_decode_end(AVCodecContext *avctx)
+{
+    CpiaContext *s = avctx->priv_data;
+
+    av_frame_free(&s->frame);
+
+    return 0;
+}
 
 AVCodec ff_cpia_decoder = {
     .name           = "cpia",
+    .long_name      = NULL_IF_CONFIG_SMALL("CPiA video format"),
     .type           = AVMEDIA_TYPE_VIDEO,
     .id             = AV_CODEC_ID_CPIA,
     .priv_data_size = sizeof(CpiaContext),
     .init           = cpia_decode_init,
+    .close          = cpia_decode_end,
     .decode         = cpia_decode_frame,
-    .capabilities   = CODEC_CAP_DR1,
-    .long_name      = NULL_IF_CONFIG_SMALL("CPiA video format"),
+    .capabilities   = AV_CODEC_CAP_DR1,
 };