X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fasvenc.c;h=c33a3b4681abfccd8e6b48587800a74651ab5e0d;hb=30f7021aa0be2c978aefb73894b643c9bafbf51c;hp=3cc94bf91a291276d21ca0005c1687bc8af8bde6;hpb=bec3b2041dcc20ab4b06a6b31d09130e1a7166c3;p=ffmpeg diff --git a/libavcodec/asvenc.c b/libavcodec/asvenc.c index 3cc94bf91a2..c33a3b4681a 100644 --- a/libavcodec/asvenc.c +++ b/libavcodec/asvenc.c @@ -32,14 +32,8 @@ #include "dct.h" #include "fdctdsp.h" #include "internal.h" -#include "mathops.h" #include "mpeg12data.h" -static inline void asv2_put_bits(PutBitContext *pb, int n, int v) -{ - put_bits(pb, n, ff_reverse[v << (8 - n)]); -} - static inline void asv1_put_level(PutBitContext *pb, int level) { unsigned int index = level + 3; @@ -47,7 +41,7 @@ static inline void asv1_put_level(PutBitContext *pb, int level) if (index <= 6) { put_bits(pb, ff_asv_level_tab[index][1], ff_asv_level_tab[index][0]); } else { - put_bits(pb, ff_asv_level_tab[3][1], ff_asv_level_tab[3][0]); + put_bits(pb, 3, 0); /* Escape code */ put_sbits(pb, 8, level); } } @@ -57,14 +51,14 @@ static inline void asv2_put_level(ASV1Context *a, PutBitContext *pb, int level) unsigned int index = level + 31; if (index <= 62) { - put_bits(pb, ff_asv2_level_tab[index][1], ff_asv2_level_tab[index][0]); + put_bits_le(pb, ff_asv2_level_tab[index][1], ff_asv2_level_tab[index][0]); } else { - put_bits(pb, ff_asv2_level_tab[31][1], ff_asv2_level_tab[31][0]); + put_bits_le(pb, 5, 0); /* Escape code */ if (level < -128 || level > 127) { av_log(a->avctx, AV_LOG_WARNING, "Clipping level %d, increase qscale\n", level); level = av_clip_int8(level); } - asv2_put_bits(pb, 8, level & 0xFF); + put_bits_le(pb, 8, level & 0xFF); } } @@ -95,7 +89,7 @@ static inline void asv1_encode_block(ASV1Context *a, int16_t block[64]) if (ccp) { for (; nc_count; nc_count--) - put_bits(&a->pb, ff_asv_ccp_tab[0][1], ff_asv_ccp_tab[0][0]); + put_bits(&a->pb, 2, 2); /* Skip */ put_bits(&a->pb, ff_asv_ccp_tab[ccp][1], ff_asv_ccp_tab[ccp][0]); @@ -111,7 +105,7 @@ static inline void asv1_encode_block(ASV1Context *a, int16_t block[64]) nc_count++; } } - put_bits(&a->pb, ff_asv_ccp_tab[16][1], ff_asv_ccp_tab[16][0]); + put_bits(&a->pb, 5, 0xF); /* End of block */ } static inline void asv2_encode_block(ASV1Context *a, int16_t block[64]) @@ -127,8 +121,8 @@ static inline void asv2_encode_block(ASV1Context *a, int16_t block[64]) count >>= 2; - asv2_put_bits(&a->pb, 4, count); - asv2_put_bits(&a->pb, 8, (block[0] + 32) >> 6); + put_bits_le(&a->pb, 4, count); + put_bits_le(&a->pb, 8, (block[0] + 32) >> 6); block[0] = 0; for (i = 0; i <= count; i++) { @@ -150,9 +144,9 @@ static inline void asv2_encode_block(ASV1Context *a, int16_t block[64]) av_assert2(i || ccp < 8); if (i) - put_bits(&a->pb, ff_asv_ac_ccp_tab[ccp][1], ff_asv_ac_ccp_tab[ccp][0]); + put_bits_le(&a->pb, ff_asv_ac_ccp_tab[ccp][1], ff_asv_ac_ccp_tab[ccp][0]); else - put_bits(&a->pb, ff_asv_dc_ccp_tab[ccp][1], ff_asv_dc_ccp_tab[ccp][0]); + put_bits_le(&a->pb, ff_asv_dc_ccp_tab[ccp][1], ff_asv_dc_ccp_tab[ccp][0]); if (ccp) { if (ccp & 8) @@ -173,7 +167,7 @@ static inline int encode_mb(ASV1Context *a, int16_t block[6][64]) { int i; - av_assert0(a->pb.buf_end - a->pb.buf - (put_bits_count(&a->pb) >> 3) >= MAX_MB_SIZE); + av_assert0(put_bytes_left(&a->pb, 0) >= MAX_MB_SIZE); if (a->avctx->codec_id == AV_CODEC_ID_ASV1) { for (i = 0; i < 6; i++) @@ -228,7 +222,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, clone->format = pict->format; clone->width = FFALIGN(pict->width, 16); clone->height = FFALIGN(pict->height, 16); - ret = av_frame_get_buffer(clone, 32); + ret = av_frame_get_buffer(clone, 0); if (ret < 0) { av_frame_free(&clone); return ret; @@ -291,19 +285,16 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, } emms_c(); - avpriv_align_put_bits(&a->pb); - while (put_bits_count(&a->pb) & 31) - put_bits(&a->pb, 8, 0); - - size = put_bits_count(&a->pb) / 32; + if (avctx->codec_id == AV_CODEC_ID_ASV1) + flush_put_bits(&a->pb); + else + flush_put_bits_le(&a->pb); + AV_WN32(put_bits_ptr(&a->pb), 0); + size = (put_bytes_output(&a->pb) + 3) / 4; if (avctx->codec_id == AV_CODEC_ID_ASV1) { a->bbdsp.bswap_buf((uint32_t *) pkt->data, (uint32_t *) pkt->data, size); - } else { - int i; - for (i = 0; i < 4 * size; i++) - pkt->data[i] = ff_reverse[pkt->data[i]]; } pkt->size = size * 4;