Message ID | 20220824084318.333-8-anton@khirnov.net |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel,01/18] tests/fate/mov: add a test for dv audio demuxed through dv demuxer | expand |
Context | Check | Description |
---|---|---|
yinshiyou/make_loongarch64 | success | Make finished |
yinshiyou/make_fate_loongarch64 | fail | Make fate failed |
andriy/make_x86 | success | Make finished |
andriy/make_fate_x86 | fail | Make fate failed |
Anton Khirnov: > The struct is quite small and the decoder and the encoder use different > fields from it, so benefits from reusing it are small. > > This allows making the buf field const. > --- > libavcodec/dvdec.c | 28 +++++++++++++++++++++------- > 1 file changed, 21 insertions(+), 7 deletions(-) > > diff --git a/libavcodec/dvdec.c b/libavcodec/dvdec.c > index 7f9e4eb0c0..444b137488 100644 > --- a/libavcodec/dvdec.c > +++ b/libavcodec/dvdec.c > @@ -48,6 +48,7 @@ > #include "dv_profile_internal.h" > #include "dvdata.h" > #include "get_bits.h" > +#include "idctdsp.h" > #include "internal.h" > #include "put_bits.h" > #include "simple_idct.h" > @@ -63,6 +64,19 @@ typedef struct BlockInfo { > int shift_offset; > } BlockInfo; > > +typedef struct DVDecContext { > + const AVDVProfile *sys; > + const AVFrame *frame; > + const uint8_t *buf; > + > + uint8_t dv_zigzag[2][64]; > + DVwork_chunk work_chunks[4 * 12 * 27]; > + uint32_t idct_factor[2 * 4 * 16 * 64]; > + void (*idct_put[2])(uint8_t *dest, ptrdiff_t stride, int16_t *block); > + > + IDCTDSPContext idsp; > +} DVDecContext; > + > static const int dv_iweight_bits = 14; > > static const uint16_t dv_iweight_88[64] = { > @@ -188,7 +202,7 @@ static void dv_init_static(void) > } > } > > -static void dv_init_weight_tables(DVVideoContext *ctx, const AVDVProfile *d) > +static void dv_init_weight_tables(DVDecContext *ctx, const AVDVProfile *d) > { > int j, i, c, s; > uint32_t *factor1 = &ctx->idct_factor[0], > @@ -237,7 +251,7 @@ static void dv_init_weight_tables(DVVideoContext *ctx, const AVDVProfile *d) > static av_cold int dvvideo_decode_init(AVCodecContext *avctx) > { > static AVOnce init_static_once = AV_ONCE_INIT; > - DVVideoContext *s = avctx->priv_data; > + DVDecContext *s = avctx->priv_data; > int i; > > avctx->chroma_sample_location = AVCHROMA_LOC_TOPLEFT; > @@ -347,7 +361,7 @@ static av_always_inline void put_block_8x4(int16_t *block, uint8_t *av_restrict > } > } > > -static void dv100_idct_put_last_row_field_chroma(const DVVideoContext *s, uint8_t *data, > +static void dv100_idct_put_last_row_field_chroma(const DVDecContext *s, uint8_t *data, > int stride, int16_t *blocks) > { > s->idsp.idct(blocks + 0*64); > @@ -359,7 +373,7 @@ static void dv100_idct_put_last_row_field_chroma(const DVVideoContext *s, uint8_ > put_block_8x4(blocks+1*64 + 4*8, data + 8 + stride, stride<<1); > } > > -static void dv100_idct_put_last_row_field_luma(const DVVideoContext *s, uint8_t *data, > +static void dv100_idct_put_last_row_field_luma(const DVDecContext *s, uint8_t *data, > int stride, int16_t *blocks) > { > s->idsp.idct(blocks + 0*64); > @@ -380,7 +394,7 @@ static void dv100_idct_put_last_row_field_luma(const DVVideoContext *s, uint8_t > /* mb_x and mb_y are in units of 8 pixels */ > static int dv_decode_video_segment(AVCodecContext *avctx, void *arg) > { > - const DVVideoContext *s = avctx->priv_data; > + const DVDecContext *s = avctx->priv_data; > DVwork_chunk *work_chunk = arg; > int quant, dc, dct_mode, class1, j; > int mb_index, mb_x, mb_y, last_index; > @@ -614,7 +628,7 @@ static int dvvideo_decode_frame(AVCodecContext *avctx, AVFrame *frame, > { > uint8_t *buf = avpkt->data; > int buf_size = avpkt->size; > - DVVideoContext *s = avctx->priv_data; > + DVDecContext *s = avctx->priv_data; > const uint8_t *vsc_pack; > int apt, is16_9, ret; > const AVDVProfile *sys; > @@ -688,7 +702,7 @@ const FFCodec ff_dvvideo_decoder = { > .p.long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"), > .p.type = AVMEDIA_TYPE_VIDEO, > .p.id = AV_CODEC_ID_DVVIDEO, > - .priv_data_size = sizeof(DVVideoContext), > + .priv_data_size = sizeof(DVDecContext), > .init = dvvideo_decode_init, > FF_CODEC_DECODE_CB(dvvideo_decode_frame), > .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_SLICE_THREADS, LGTM. - Andreas
diff --git a/libavcodec/dvdec.c b/libavcodec/dvdec.c index 7f9e4eb0c0..444b137488 100644 --- a/libavcodec/dvdec.c +++ b/libavcodec/dvdec.c @@ -48,6 +48,7 @@ #include "dv_profile_internal.h" #include "dvdata.h" #include "get_bits.h" +#include "idctdsp.h" #include "internal.h" #include "put_bits.h" #include "simple_idct.h" @@ -63,6 +64,19 @@ typedef struct BlockInfo { int shift_offset; } BlockInfo; +typedef struct DVDecContext { + const AVDVProfile *sys; + const AVFrame *frame; + const uint8_t *buf; + + uint8_t dv_zigzag[2][64]; + DVwork_chunk work_chunks[4 * 12 * 27]; + uint32_t idct_factor[2 * 4 * 16 * 64]; + void (*idct_put[2])(uint8_t *dest, ptrdiff_t stride, int16_t *block); + + IDCTDSPContext idsp; +} DVDecContext; + static const int dv_iweight_bits = 14; static const uint16_t dv_iweight_88[64] = { @@ -188,7 +202,7 @@ static void dv_init_static(void) } } -static void dv_init_weight_tables(DVVideoContext *ctx, const AVDVProfile *d) +static void dv_init_weight_tables(DVDecContext *ctx, const AVDVProfile *d) { int j, i, c, s; uint32_t *factor1 = &ctx->idct_factor[0], @@ -237,7 +251,7 @@ static void dv_init_weight_tables(DVVideoContext *ctx, const AVDVProfile *d) static av_cold int dvvideo_decode_init(AVCodecContext *avctx) { static AVOnce init_static_once = AV_ONCE_INIT; - DVVideoContext *s = avctx->priv_data; + DVDecContext *s = avctx->priv_data; int i; avctx->chroma_sample_location = AVCHROMA_LOC_TOPLEFT; @@ -347,7 +361,7 @@ static av_always_inline void put_block_8x4(int16_t *block, uint8_t *av_restrict } } -static void dv100_idct_put_last_row_field_chroma(const DVVideoContext *s, uint8_t *data, +static void dv100_idct_put_last_row_field_chroma(const DVDecContext *s, uint8_t *data, int stride, int16_t *blocks) { s->idsp.idct(blocks + 0*64); @@ -359,7 +373,7 @@ static void dv100_idct_put_last_row_field_chroma(const DVVideoContext *s, uint8_ put_block_8x4(blocks+1*64 + 4*8, data + 8 + stride, stride<<1); } -static void dv100_idct_put_last_row_field_luma(const DVVideoContext *s, uint8_t *data, +static void dv100_idct_put_last_row_field_luma(const DVDecContext *s, uint8_t *data, int stride, int16_t *blocks) { s->idsp.idct(blocks + 0*64); @@ -380,7 +394,7 @@ static void dv100_idct_put_last_row_field_luma(const DVVideoContext *s, uint8_t /* mb_x and mb_y are in units of 8 pixels */ static int dv_decode_video_segment(AVCodecContext *avctx, void *arg) { - const DVVideoContext *s = avctx->priv_data; + const DVDecContext *s = avctx->priv_data; DVwork_chunk *work_chunk = arg; int quant, dc, dct_mode, class1, j; int mb_index, mb_x, mb_y, last_index; @@ -614,7 +628,7 @@ static int dvvideo_decode_frame(AVCodecContext *avctx, AVFrame *frame, { uint8_t *buf = avpkt->data; int buf_size = avpkt->size; - DVVideoContext *s = avctx->priv_data; + DVDecContext *s = avctx->priv_data; const uint8_t *vsc_pack; int apt, is16_9, ret; const AVDVProfile *sys; @@ -688,7 +702,7 @@ const FFCodec ff_dvvideo_decoder = { .p.long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"), .p.type = AVMEDIA_TYPE_VIDEO, .p.id = AV_CODEC_ID_DVVIDEO, - .priv_data_size = sizeof(DVVideoContext), + .priv_data_size = sizeof(DVDecContext), .init = dvvideo_decode_init, FF_CODEC_DECODE_CB(dvvideo_decode_frame), .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_SLICE_THREADS,