diff mbox

[FFmpeg-devel,2/3] avcodec/mjpeg: Pass full buffer to hwaccel start_frame

Message ID 20180218235333.6965-3-philipl@overt.org
State New
Headers show

Commit Message

Philip Langdale Feb. 18, 2018, 11:53 p.m. UTC
---
 libavcodec/mjpegdec.c | 6 ++++--
 libavcodec/mjpegdec.h | 5 +++--
 2 files changed, 7 insertions(+), 4 deletions(-)

Comments

James Almer Feb. 19, 2018, 3:37 a.m. UTC | #1
On 2/18/2018 8:53 PM, Philip Langdale wrote:
> ---
>  libavcodec/mjpegdec.c | 6 ++++--
>  libavcodec/mjpegdec.h | 5 +++--
>  2 files changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c
> index 9a7a329b19..b41d2ce467 100644
> --- a/libavcodec/mjpegdec.c
> +++ b/libavcodec/mjpegdec.c
> @@ -715,8 +715,8 @@ unk_pixfmt:
>          if (!s->hwaccel_picture_private)
>              return AVERROR(ENOMEM);
>  
> -        ret = s->avctx->hwaccel->start_frame(s->avctx, s->raw_buffer,
> -                                             s->raw_buffer_size);
> +        ret = s->avctx->hwaccel->start_frame(s->avctx, s->raw_packet->data,
> +                                             s->raw_packet->size);
>          if (ret < 0)
>              return ret;
>      }
> @@ -2242,6 +2242,8 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
>      int ret = 0;
>      int is16bit;
>  
> +    s->raw_packet = avpkt;

Shouldn't you create a reference instead? Not sure how safe this is
otherwise. But then again, raw_buffer is using the same buffer.
If there's no risk for the packet to be unreferenced and the buffer
freed before you get to call start_frame() then it should be ok.

> +
>      av_dict_free(&s->exif_metadata);
>      av_freep(&s->stereo3d);
>      s->adobe_transform = -1;
> diff --git a/libavcodec/mjpegdec.h b/libavcodec/mjpegdec.h
> index 11dfdbf62b..b47f54a5b9 100644
> --- a/libavcodec/mjpegdec.h
> +++ b/libavcodec/mjpegdec.h
> @@ -139,8 +139,9 @@ typedef struct MJpegDecodeContext {
>      int iccread;
>  
>      // Raw stream data for hwaccel use.
> -    const uint8_t *raw_buffer;
> -    size_t         raw_buffer_size;
> +    const AVPacket *raw_packet;
> +    const uint8_t  *raw_buffer;
> +    size_t          raw_buffer_size;
>  
>      uint8_t raw_huffman_lengths[2][4][16];
>      uint8_t raw_huffman_values[2][4][256];
>
diff mbox

Patch

diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c
index 9a7a329b19..b41d2ce467 100644
--- a/libavcodec/mjpegdec.c
+++ b/libavcodec/mjpegdec.c
@@ -715,8 +715,8 @@  unk_pixfmt:
         if (!s->hwaccel_picture_private)
             return AVERROR(ENOMEM);
 
-        ret = s->avctx->hwaccel->start_frame(s->avctx, s->raw_buffer,
-                                             s->raw_buffer_size);
+        ret = s->avctx->hwaccel->start_frame(s->avctx, s->raw_packet->data,
+                                             s->raw_packet->size);
         if (ret < 0)
             return ret;
     }
@@ -2242,6 +2242,8 @@  int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
     int ret = 0;
     int is16bit;
 
+    s->raw_packet = avpkt;
+
     av_dict_free(&s->exif_metadata);
     av_freep(&s->stereo3d);
     s->adobe_transform = -1;
diff --git a/libavcodec/mjpegdec.h b/libavcodec/mjpegdec.h
index 11dfdbf62b..b47f54a5b9 100644
--- a/libavcodec/mjpegdec.h
+++ b/libavcodec/mjpegdec.h
@@ -139,8 +139,9 @@  typedef struct MJpegDecodeContext {
     int iccread;
 
     // Raw stream data for hwaccel use.
-    const uint8_t *raw_buffer;
-    size_t         raw_buffer_size;
+    const AVPacket *raw_packet;
+    const uint8_t  *raw_buffer;
+    size_t          raw_buffer_size;
 
     uint8_t raw_huffman_lengths[2][4][16];
     uint8_t raw_huffman_values[2][4][256];