#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;
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);
}
}
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);
}
}
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]);
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])
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++) {
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)
{
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++)
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;
}
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;