Merge commit '759001c534287a96dc96d1e274665feb7059145d'
[ffmpeg.git] / libavcodec / sanm.c
index caeaa36..8268730 100644 (file)
@@ -46,7 +46,7 @@ typedef struct {
     int aligned_width, aligned_height;
     int prev_seq;
 
-    AVFrame frame, *output;
+    AVFrame *frame;
     uint16_t *frm0, *frm1, *frm2;
     uint8_t *stored_frame;
     uint32_t frm0_size, frm1_size, frm2_size;
@@ -274,8 +274,6 @@ static av_cold int decode_init(AVCodecContext *avctx)
         av_log(avctx, AV_LOG_ERROR, "error allocating buffers\n");
         return AVERROR(ENOMEM);
     }
-    ctx->output          = &ctx->frame;
-    ctx->output->data[0] = 0;
 
     make_glyphs(ctx->p4x4glyphs[0], glyph4_x, glyph4_y, 4);
     make_glyphs(ctx->p8x8glyphs[0], glyph8_x, glyph8_y, 8);
@@ -302,11 +300,6 @@ static av_cold int decode_end(AVCodecContext *avctx)
 
     destroy_buffers(ctx);
 
-    if (ctx->frame.data[0]) {
-        avctx->release_buffer(avctx, &ctx->frame);
-        ctx->frame.data[0] = 0;
-    }
-
     return 0;
 }
 
@@ -1151,13 +1144,13 @@ static int copy_output(SANMVideoContext *ctx, SANMFrameHeader *hdr)
     int ret, dstpitch, height = ctx->height;
     int srcpitch = ctx->pitch * (hdr ? sizeof(ctx->frm0[0]) : 1);
 
-    if ((ret = ff_get_buffer(ctx->avctx, ctx->output)) < 0) {
+    if ((ret = ff_get_buffer(ctx->avctx, ctx->frame, 0)) < 0) {
         av_log(ctx->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
         return ret;
     }
 
-    dst      = ctx->output->data[0];
-    dstpitch = ctx->output->linesize[0];
+    dst      = ctx->frame->data[0];
+    dstpitch = ctx->frame->linesize[0];
 
     while (height--) {
         memcpy(dst, src, srcpitch);
@@ -1174,9 +1167,8 @@ static int decode_frame(AVCodecContext *avctx, void *data,
     SANMVideoContext *ctx = avctx->priv_data;
     int i, ret;
 
+    ctx->frame = data;
     bytestream2_init(&ctx->gb, pkt->data, pkt->size);
-    if (ctx->output->data[0])
-        avctx->release_buffer(avctx, ctx->output);
 
     if (!ctx->version) {
         int to_store = 0;
@@ -1258,7 +1250,7 @@ static int decode_frame(AVCodecContext *avctx, void *data,
             memcpy(ctx->stored_frame, ctx->frm0, ctx->buf_size);
         if ((ret = copy_output(ctx, NULL)))
             return ret;
-        memcpy(ctx->output->data[1], ctx->pal, 1024);
+        memcpy(ctx->frame->data[1], ctx->pal, 1024);
     } else {
         SANMFrameHeader header;
 
@@ -1266,12 +1258,12 @@ static int decode_frame(AVCodecContext *avctx, void *data,
             return ret;
 
         ctx->rotate_code = header.rotate_code;
-        if ((ctx->output->key_frame = !header.seq_num)) {
-            ctx->output->pict_type = AV_PICTURE_TYPE_I;
+        if ((ctx->frame->key_frame = !header.seq_num)) {
+            ctx->frame->pict_type = AV_PICTURE_TYPE_I;
             fill_frame(ctx->frm1, ctx->npixels, header.bg_color);
             fill_frame(ctx->frm2, ctx->npixels, header.bg_color);
         } else {
-            ctx->output->pict_type = AV_PICTURE_TYPE_P;
+            ctx->frame->pict_type = AV_PICTURE_TYPE_P;
         }
 
         if (header.codec < FF_ARRAY_ELEMS(v1_decoders)) {
@@ -1293,7 +1285,6 @@ static int decode_frame(AVCodecContext *avctx, void *data,
         rotate_bufs(ctx, ctx->rotate_code);
 
     *got_frame_ptr  = 1;
-    *(AVFrame*)data = *ctx->output;
 
     return pkt->size;
 }