X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=libavcodec%2Fasvdec.c;h=252f88ab6e68e490c5456b3027e5866a65d255b4;hb=e3fcb14347466095839c2a3c47ebecff02da891e;hp=adc114f7ab8bde2cb05d9c66427891e108e5cae7;hpb=88bd7fdc821aaa0cbcf44cf075c62aaa42121e3f;p=ffmpeg diff --git a/libavcodec/asvdec.c b/libavcodec/asvdec.c index adc114f7ab8..252f88ab6e6 100644 --- a/libavcodec/asvdec.c +++ b/libavcodec/asvdec.c @@ -28,15 +28,13 @@ #include "asv.h" #include "avcodec.h" +#include "blockdsp.h" #include "put_bits.h" -#include "dsputil.h" +#include "idctdsp.h" #include "internal.h" #include "mathops.h" #include "mpeg12data.h" -//#undef NDEBUG -//#include - #define VLC_BITS 6 #define ASV2_LEVEL_VLC_BITS 10 @@ -168,7 +166,7 @@ static inline int decode_mb(ASV1Context *a, int16_t block[6][64]) { int i; - a->dsp.clear_blocks(block[0]); + a->bdsp.clear_blocks(block[0]); if (a->avctx->codec_id == AV_CODEC_ID_ASV1) { for (i = 0; i < 6; i++) { @@ -184,23 +182,23 @@ static inline int decode_mb(ASV1Context *a, int16_t block[6][64]) return 0; } -static inline void idct_put(ASV1Context *a, int mb_x, int mb_y) +static inline void idct_put(ASV1Context *a, AVFrame *frame, int mb_x, int mb_y) { int16_t (*block)[64] = a->block; - int linesize = a->picture.linesize[0]; + int linesize = frame->linesize[0]; - uint8_t *dest_y = a->picture.data[0] + (mb_y * 16* linesize ) + mb_x * 16; - uint8_t *dest_cb = a->picture.data[1] + (mb_y * 8 * a->picture.linesize[1]) + mb_x * 8; - uint8_t *dest_cr = a->picture.data[2] + (mb_y * 8 * a->picture.linesize[2]) + mb_x * 8; + uint8_t *dest_y = frame->data[0] + (mb_y * 16* linesize ) + mb_x * 16; + uint8_t *dest_cb = frame->data[1] + (mb_y * 8 * frame->linesize[1]) + mb_x * 8; + uint8_t *dest_cr = frame->data[2] + (mb_y * 8 * frame->linesize[2]) + mb_x * 8; - a->dsp.idct_put(dest_y , linesize, block[0]); - a->dsp.idct_put(dest_y + 8, linesize, block[1]); - a->dsp.idct_put(dest_y + 8*linesize , linesize, block[2]); - a->dsp.idct_put(dest_y + 8*linesize + 8, linesize, block[3]); + a->idsp.idct_put(dest_y, linesize, block[0]); + a->idsp.idct_put(dest_y + 8, linesize, block[1]); + a->idsp.idct_put(dest_y + 8 * linesize, linesize, block[2]); + a->idsp.idct_put(dest_y + 8 * linesize + 8, linesize, block[3]); if (!(a->avctx->flags&CODEC_FLAG_GRAY)) { - a->dsp.idct_put(dest_cb, a->picture.linesize[1], block[4]); - a->dsp.idct_put(dest_cr, a->picture.linesize[2], block[5]); + a->idsp.idct_put(dest_cb, frame->linesize[1], block[4]); + a->idsp.idct_put(dest_cr, frame->linesize[2], block[5]); } } @@ -211,15 +209,10 @@ static int decode_frame(AVCodecContext *avctx, ASV1Context * const a = avctx->priv_data; const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; - AVFrame *picture = data; - AVFrame * const p = &a->picture; + AVFrame * const p = data; int mb_x, mb_y, ret; - if (p->data[0]) - avctx->release_buffer(avctx, p); - - p->reference = 0; - if ((ret = ff_get_buffer(avctx, p)) < 0) { + if ((ret = ff_get_buffer(avctx, p, 0)) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return ret; } @@ -232,7 +225,8 @@ static int decode_frame(AVCodecContext *avctx, return AVERROR(ENOMEM); if (avctx->codec_id == AV_CODEC_ID_ASV1) - a->dsp.bswap_buf((uint32_t*)a->bitstream_buffer, (const uint32_t*)buf, buf_size/4); + a->bbdsp.bswap_buf((uint32_t *) a->bitstream_buffer, + (const uint32_t *) buf, buf_size / 4); else { int i; for (i = 0; i < buf_size; i++) @@ -246,7 +240,7 @@ static int decode_frame(AVCodecContext *avctx, if ((ret = decode_mb(a, a->block)) < 0) return ret; - idct_put(a, mb_x, mb_y); + idct_put(a, p, mb_x, mb_y); } } @@ -256,7 +250,7 @@ static int decode_frame(AVCodecContext *avctx, if ((ret = decode_mb(a, a->block)) < 0) return ret; - idct_put(a, mb_x, mb_y); + idct_put(a, p, mb_x, mb_y); } } @@ -266,11 +260,10 @@ static int decode_frame(AVCodecContext *avctx, if ((ret = decode_mb(a, a->block)) < 0) return ret; - idct_put(a, mb_x, mb_y); + idct_put(a, p, mb_x, mb_y); } } - *picture = a->picture; *got_frame = 1; emms_c(); @@ -281,13 +274,19 @@ static int decode_frame(AVCodecContext *avctx, static av_cold int decode_init(AVCodecContext *avctx) { ASV1Context * const a = avctx->priv_data; - AVFrame *p = &a->picture; const int scale = avctx->codec_id == AV_CODEC_ID_ASV1 ? 1 : 2; int i; + if (avctx->extradata_size < 1) { + av_log(avctx, AV_LOG_ERROR, "No extradata provided\n"); + return AVERROR_INVALIDDATA; + } + ff_asv_common_init(avctx); + ff_blockdsp_init(&a->bdsp, avctx); + ff_idctdsp_init(&a->idsp, avctx); init_vlcs(a); - ff_init_scantable(a->dsp.idct_permutation, &a->scantable, ff_asv_scantab); + ff_init_scantable(a->idsp.idct_permutation, &a->scantable, ff_asv_scantab); avctx->pix_fmt = AV_PIX_FMT_YUV420P; a->inv_qscale = avctx->extradata[0]; @@ -305,11 +304,6 @@ static av_cold int decode_init(AVCodecContext *avctx) a->intra_matrix[i] = 64 * scale * ff_mpeg1_default_intra_matrix[index] / a->inv_qscale; } - p->qstride = a->mb_width; - p->qscale_table = av_malloc(p->qstride * a->mb_height); - p->quality = (32 * scale + a->inv_qscale / 2) / a->inv_qscale; - memset(p->qscale_table, p->quality, p->qstride * a->mb_height); - return 0; } @@ -318,17 +312,14 @@ static av_cold int decode_end(AVCodecContext *avctx) ASV1Context * const a = avctx->priv_data; av_freep(&a->bitstream_buffer); - av_freep(&a->picture.qscale_table); a->bitstream_buffer_size = 0; - if (a->picture.data[0]) - avctx->release_buffer(avctx, &a->picture); - return 0; } AVCodec ff_asv1_decoder = { .name = "asv1", + .long_name = NULL_IF_CONFIG_SMALL("ASUS V1"), .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_ASV1, .priv_data_size = sizeof(ASV1Context), @@ -336,11 +327,11 @@ AVCodec ff_asv1_decoder = { .close = decode_end, .decode = decode_frame, .capabilities = CODEC_CAP_DR1, - .long_name = NULL_IF_CONFIG_SMALL("ASUS V1"), }; AVCodec ff_asv2_decoder = { .name = "asv2", + .long_name = NULL_IF_CONFIG_SMALL("ASUS V2"), .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_ASV2, .priv_data_size = sizeof(ASV1Context), @@ -348,6 +339,5 @@ AVCodec ff_asv2_decoder = { .close = decode_end, .decode = decode_frame, .capabilities = CODEC_CAP_DR1, - .long_name = NULL_IF_CONFIG_SMALL("ASUS V2"), };