[FFmpeg-devel] [PATCH 4/8] avcodec: Constify some AVPackets

James Almer jamrial at gmail.com
Thu Mar 4 18:42:40 EET 2021


On 3/4/2021 12:42 PM, Andreas Rheinhardt wrote:
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---
> Of all the decoders using the simple decode API (i.e. with .decode set)
> only imm5 seems to modify its input packet (which is fine given that it
> is not the user-supplied reference);

Having that decoder make a writable copy using a different AVPacket 
struct, so the input one can be constified, sounds like a good idea in 
order to make the AVPacket parameter in AVCodec->decode() const (If 
that's what you're trying to achieve), and would be consistent with 
AVCodec->encode2().

For that matter, why is got_frame called "outdata_size" in codec.h? Did 
the purpose of that parameter change at some point?

libfdk_aac's API is not
> const-correct, so as-is it is not compatible with constifiying the AVPacket
> in the .decode function, yet this is easily fixable.
> 
>   libavcodec/aacdec_template.c |  3 ++-
>   libavcodec/audiotoolboxdec.c |  3 ++-
>   libavcodec/bitpacked.c       |  6 +++---
>   libavcodec/dsddec.c          |  4 ++--
>   libavcodec/flashsv.c         |  2 +-
>   libavcodec/movtextdec.c      | 10 +++++-----
>   libavcodec/pgxdec.c          |  6 +++---
>   libavcodec/pixlet.c          |  2 +-
>   libavcodec/pngdec.c          |  2 +-
>   libavcodec/rasc.c            | 14 +++++++-------
>   libavcodec/tiff.c            |  3 ++-
>   libavcodec/vp8.c             |  2 +-
>   12 files changed, 30 insertions(+), 27 deletions(-)
> 
> diff --git a/libavcodec/aacdec_template.c b/libavcodec/aacdec_template.c
> index aa89f7cbb8..7b78566993 100644
> --- a/libavcodec/aacdec_template.c
> +++ b/libavcodec/aacdec_template.c
> @@ -3216,7 +3216,8 @@ static int aac_decode_er_frame(AVCodecContext *avctx, void *data,
>   }
>   
>   static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
> -                                int *got_frame_ptr, GetBitContext *gb, AVPacket *avpkt)
> +                                int *got_frame_ptr, GetBitContext *gb,
> +                                const AVPacket *avpkt)
>   {
>       AACContext *ac = avctx->priv_data;
>       ChannelElement *che = NULL, *che_prev = NULL;
> diff --git a/libavcodec/audiotoolboxdec.c b/libavcodec/audiotoolboxdec.c
> index 1f3f7f5ac5..8f9a8d5c27 100644
> --- a/libavcodec/audiotoolboxdec.c
> +++ b/libavcodec/audiotoolboxdec.c
> @@ -296,7 +296,8 @@ static int ffat_set_extradata(AVCodecContext *avctx)
>       return 0;
>   }
>   
> -static av_cold int ffat_create_decoder(AVCodecContext *avctx, AVPacket *pkt)
> +static av_cold int ffat_create_decoder(AVCodecContext *avctx,
> +                                       const AVPacket *pkt)
>   {
>       ATDecodeContext *at = avctx->priv_data;
>       OSStatus status;
> diff --git a/libavcodec/bitpacked.c b/libavcodec/bitpacked.c
> index 952ba73a32..23e82c69b5 100644
> --- a/libavcodec/bitpacked.c
> +++ b/libavcodec/bitpacked.c
> @@ -33,12 +33,12 @@
>   
>   struct BitpackedContext {
>       int (*decode)(AVCodecContext *avctx, AVFrame *frame,
> -                  AVPacket *pkt);
> +                  const AVPacket *pkt);
>   };
>   
>   /* For this format, it's a simple passthrough */
>   static int bitpacked_decode_uyvy422(AVCodecContext *avctx, AVFrame *frame,
> -                                    AVPacket *avpkt)
> +                                    const AVPacket *avpkt)
>   {
>       int ret;
>   
> @@ -56,7 +56,7 @@ static int bitpacked_decode_uyvy422(AVCodecContext *avctx, AVFrame *frame,
>   }
>   
>   static int bitpacked_decode_yuv422p10(AVCodecContext *avctx, AVFrame *frame,
> -                                      AVPacket *avpkt)
> +                                      const AVPacket *avpkt)
>   {
>       uint64_t frame_size = (uint64_t)avctx->width * (uint64_t)avctx->height * 20;
>       uint64_t packet_size = (uint64_t)avpkt->size * 8;
> diff --git a/libavcodec/dsddec.c b/libavcodec/dsddec.c
> index 9814c9eb82..21d1d9f5de 100644
> --- a/libavcodec/dsddec.c
> +++ b/libavcodec/dsddec.c
> @@ -66,7 +66,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
>   
>   typedef struct ThreadData {
>       AVFrame *frame;
> -    AVPacket *avpkt;
> +    const AVPacket *avpkt;
>   } ThreadData;
>   
>   static int dsd_channel(AVCodecContext *avctx, void *tdata, int j, int threadnr)
> @@ -75,7 +75,7 @@ static int dsd_channel(AVCodecContext *avctx, void *tdata, int j, int threadnr)
>       DSDContext *s = avctx->priv_data;
>       ThreadData *td = tdata;
>       AVFrame *frame = td->frame;
> -    AVPacket *avpkt = td->avpkt;
> +    const AVPacket *avpkt = td->avpkt;
>       int src_next, src_stride;
>       float *dst = ((float **)frame->extended_data)[j];
>   
> diff --git a/libavcodec/flashsv.c b/libavcodec/flashsv.c
> index f55cb0feeb..9481f80f0b 100644
> --- a/libavcodec/flashsv.c
> +++ b/libavcodec/flashsv.c
> @@ -179,7 +179,7 @@ static int flashsv2_prime(FlashSVContext *s, uint8_t *src, int size)
>       return 0;
>   }
>   
> -static int flashsv_decode_block(AVCodecContext *avctx, AVPacket *avpkt,
> +static int flashsv_decode_block(AVCodecContext *avctx, const AVPacket *avpkt,
>                                   GetBitContext *gb, int block_size,
>                                   int width, int height, int x_pos, int y_pos,
>                                   int blk_idx)
> diff --git a/libavcodec/movtextdec.c b/libavcodec/movtextdec.c
> index ad790bf44c..7adc16d262 100644
> --- a/libavcodec/movtextdec.c
> +++ b/libavcodec/movtextdec.c
> @@ -117,7 +117,7 @@ typedef struct {
>   typedef struct {
>       uint32_t type;
>       size_t base_size;
> -    int (*decode)(const uint8_t *tsmb, MovTextContext *m, AVPacket *avpkt);
> +    int (*decode)(const uint8_t *tsmb, MovTextContext *m, const AVPacket *avpkt);
>   } Box;
>   
>   static void mov_text_cleanup(MovTextContext *m)
> @@ -240,14 +240,14 @@ static int mov_text_tx3g(AVCodecContext *avctx, MovTextContext *m)
>       return 0;
>   }
>   
> -static int decode_twrp(const uint8_t *tsmb, MovTextContext *m, AVPacket *avpkt)
> +static int decode_twrp(const uint8_t *tsmb, MovTextContext *m, const AVPacket *avpkt)
>   {
>       m->box_flags |= TWRP_BOX;
>       m->w.wrap_flag = bytestream_get_byte(&tsmb);
>       return 0;
>   }
>   
> -static int decode_hlit(const uint8_t *tsmb, MovTextContext *m, AVPacket *avpkt)
> +static int decode_hlit(const uint8_t *tsmb, MovTextContext *m, const AVPacket *avpkt)
>   {
>       m->box_flags |= HLIT_BOX;
>       m->h.hlit_start = bytestream_get_be16(&tsmb);
> @@ -255,14 +255,14 @@ static int decode_hlit(const uint8_t *tsmb, MovTextContext *m, AVPacket *avpkt)
>       return 0;
>   }
>   
> -static int decode_hclr(const uint8_t *tsmb, MovTextContext *m, AVPacket *avpkt)
> +static int decode_hclr(const uint8_t *tsmb, MovTextContext *m, const AVPacket *avpkt)
>   {
>       m->box_flags |= HCLR_BOX;
>       bytestream_get_buffer(&tsmb, m->c.hlit_color, 4);
>       return 0;
>   }
>   
> -static int decode_styl(const uint8_t *tsmb, MovTextContext *m, AVPacket *avpkt)
> +static int decode_styl(const uint8_t *tsmb, MovTextContext *m, const AVPacket *avpkt)
>   {
>       int i;
>       int style_entries = bytestream_get_be16(&tsmb);
> diff --git a/libavcodec/pgxdec.c b/libavcodec/pgxdec.c
> index 5c735894ab..65b2929283 100644
> --- a/libavcodec/pgxdec.c
> +++ b/libavcodec/pgxdec.c
> @@ -95,7 +95,7 @@ error:
>   }
>   
>   #define WRITE_FRAME(D, PIXEL, suffix)                                                       \
> -    static inline void write_frame_ ##D(AVPacket *avpkt, AVFrame *frame, GetByteContext *g, \
> +    static inline void write_frame_ ##D(AVFrame *frame, GetByteContext *g, \
>                                           int width, int height, int sign, int depth)         \
>       {                                                                                       \
>           int i, j;                                                                           \
> @@ -151,9 +151,9 @@ static int pgx_decode_frame(AVCodecContext *avctx, void *data,
>       p->key_frame = 1;
>       avctx->bits_per_raw_sample = depth;
>       if (bpp == 8)
> -        write_frame_8(avpkt, p, &g, width, height, sign, depth);
> +        write_frame_8(p, &g, width, height, sign, depth);
>       else if (bpp == 16)
> -        write_frame_16(avpkt, p, &g, width, height, sign, depth);
> +        write_frame_16(p, &g, width, height, sign, depth);
>       *got_frame = 1;
>       return 0;
>   }
> diff --git a/libavcodec/pixlet.c b/libavcodec/pixlet.c
> index 42acd683fa..ad9d830af7 100644
> --- a/libavcodec/pixlet.c
> +++ b/libavcodec/pixlet.c
> @@ -525,7 +525,7 @@ static void postprocess_chroma(AVFrame *frame, int w, int h, int depth)
>   }
>   
>   static int decode_plane(AVCodecContext *avctx, int plane,
> -                        AVPacket *avpkt, AVFrame *frame)
> +                        const AVPacket *avpkt, AVFrame *frame)
>   {
>       PixletContext *ctx = avctx->priv_data;
>       ptrdiff_t stride   = frame->linesize[plane] / 2;
> diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
> index cece08ebca..a5a71ef161 100644
> --- a/libavcodec/pngdec.c
> +++ b/libavcodec/pngdec.c
> @@ -1179,7 +1179,7 @@ static int handle_p_frame_apng(AVCodecContext *avctx, PNGDecContext *s,
>   }
>   
>   static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s,
> -                               AVFrame *p, AVPacket *avpkt)
> +                               AVFrame *p, const AVPacket *avpkt)
>   {
>       const AVCRC *crc_tab = av_crc_get_table(AV_CRC_32_IEEE_LE);
>       AVDictionary **metadatap = NULL;
> diff --git a/libavcodec/rasc.c b/libavcodec/rasc.c
> index 706940bf5f..207d50c452 100644
> --- a/libavcodec/rasc.c
> +++ b/libavcodec/rasc.c
> @@ -112,7 +112,7 @@ static int init_frames(AVCodecContext *avctx)
>   }
>   
>   static int decode_fint(AVCodecContext *avctx,
> -                       AVPacket *avpkt, unsigned size)
> +                       const AVPacket *avpkt, unsigned size)
>   {
>       RASCContext *s = avctx->priv_data;
>       GetByteContext *gb = &s->gb;
> @@ -171,7 +171,7 @@ static int decode_fint(AVCodecContext *avctx,
>       return 0;
>   }
>   
> -static int decode_zlib(AVCodecContext *avctx, AVPacket *avpkt,
> +static int decode_zlib(AVCodecContext *avctx, const AVPacket *avpkt,
>                          unsigned size, unsigned uncompressed_size)
>   {
>       RASCContext *s = avctx->priv_data;
> @@ -205,7 +205,7 @@ static int decode_zlib(AVCodecContext *avctx, AVPacket *avpkt,
>   }
>   
>   static int decode_move(AVCodecContext *avctx,
> -                       AVPacket *avpkt, unsigned size)
> +                       const AVPacket *avpkt, unsigned size)
>   {
>       RASCContext *s = avctx->priv_data;
>       GetByteContext *gb = &s->gb;
> @@ -329,7 +329,7 @@ static int decode_move(AVCodecContext *avctx,
>       len--;
>   
>   static int decode_dlta(AVCodecContext *avctx,
> -                       AVPacket *avpkt, unsigned size)
> +                       const AVPacket *avpkt, unsigned size)
>   {
>       RASCContext *s = avctx->priv_data;
>       GetByteContext *gb = &s->gb;
> @@ -471,7 +471,7 @@ static int decode_dlta(AVCodecContext *avctx,
>   }
>   
>   static int decode_kfrm(AVCodecContext *avctx,
> -                       AVPacket *avpkt, unsigned size)
> +                       const AVPacket *avpkt, unsigned size)
>   {
>       RASCContext *s = avctx->priv_data;
>       GetByteContext *gb = &s->gb;
> @@ -534,7 +534,7 @@ static int decode_kfrm(AVCodecContext *avctx,
>   }
>   
>   static int decode_mous(AVCodecContext *avctx,
> -                       AVPacket *avpkt, unsigned size)
> +                       const AVPacket *avpkt, unsigned size)
>   {
>       RASCContext *s = avctx->priv_data;
>       GetByteContext *gb = &s->gb;
> @@ -574,7 +574,7 @@ static int decode_mous(AVCodecContext *avctx,
>   }
>   
>   static int decode_mpos(AVCodecContext *avctx,
> -                       AVPacket *avpkt, unsigned size)
> +                       const AVPacket *avpkt, unsigned size)
>   {
>       RASCContext *s = avctx->priv_data;
>       GetByteContext *gb = &s->gb;
> diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c
> index d1e908fd43..9cd2876851 100644
> --- a/libavcodec/tiff.c
> +++ b/libavcodec/tiff.c
> @@ -964,7 +964,8 @@ static int dng_decode_jpeg(AVCodecContext *avctx, AVFrame *frame,
>       return 0;
>   }
>   
> -static int dng_decode_tiles(AVCodecContext *avctx, AVFrame *frame, AVPacket *avpkt)
> +static int dng_decode_tiles(AVCodecContext *avctx, AVFrame *frame,
> +                            const AVPacket *avpkt)
>   {
>       TiffContext *s = avctx->priv_data;
>       int tile_idx;
> diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
> index 89c48e6cb1..d16e7b6aa3 100644
> --- a/libavcodec/vp8.c
> +++ b/libavcodec/vp8.c
> @@ -2622,7 +2622,7 @@ static int vp8_decode_mb_row_sliced(AVCodecContext *avctx, void *tdata,
>   
>   static av_always_inline
>   int vp78_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
> -                      AVPacket *avpkt, int is_vp7)
> +                      const AVPacket *avpkt, int is_vp7)
>   {
>       VP8Context *s = avctx->priv_data;
>       int ret, i, referenced, num_jobs;
> 



More information about the ffmpeg-devel mailing list