summaryrefslogtreecommitdiff
path: root/libavcodec/mpeg12.c
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2006-05-13 17:16:58 +0000
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>2006-05-13 17:16:58 +0000
commit307eb248794057e86028a6468ddf257c915151cc (patch)
tree27fefe5001d337f593c27f180e0f60d12ccb9ec9 /libavcodec/mpeg12.c
parentd634aa2095b878f01877c4702a655bb0ecc2645a (diff)
add MPEG-2 intra vlc support
Originally committed as revision 5372 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/mpeg12.c')
-rw-r--r--libavcodec/mpeg12.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c
index bdd965313b..86377850d2 100644
--- a/libavcodec/mpeg12.c
+++ b/libavcodec/mpeg12.c
@@ -95,6 +95,7 @@ static uint8_t (*mv_penalty)[MAX_MV*2+1]= NULL;
static uint8_t fcode_tab[MAX_MV*2+1];
static uint8_t uni_mpeg1_ac_vlc_len [64*64*2];
+static uint8_t uni_mpeg2_ac_vlc_len [64*64*2];
/* simple include everything table for dc, first byte is bits number next 3 are code*/
static uint32_t mpeg1_lum_dc_uni[512];
@@ -166,11 +167,11 @@ static void init_uni_ac_vlc(RLTable *rl, uint8_t *uni_ac_vlc_len){
if (code < 111 /* rl->n */) {
/* store the vlc & sign at once */
- len= mpeg1_vlc[code][1]+1;
- bits= (mpeg1_vlc[code][0]<<1) + sign;
+ len= rl->table_vlc[code][1]+1;
+ bits= (rl->table_vlc[code][0]<<1) + sign;
} else {
- len= mpeg1_vlc[111/*rl->n*/][1]+6;
- bits= mpeg1_vlc[111/*rl->n*/][0]<<6;
+ len= rl->table_vlc[111/*rl->n*/][1]+6;
+ bits= rl->table_vlc[111/*rl->n*/][0]<<6;
bits|= run;
if (alevel < 128) {
@@ -766,6 +767,8 @@ void ff_mpeg1_encode_init(MpegEncContext *s)
done=1;
init_rl(&rl_mpeg1, 1);
+ if(s->intra_vlc_format)
+ init_rl(&rl_mpeg2, 1);
for(i=0; i<64; i++)
{
@@ -774,6 +777,8 @@ void ff_mpeg1_encode_init(MpegEncContext *s)
}
init_uni_ac_vlc(&rl_mpeg1, uni_mpeg1_ac_vlc_len);
+ if(s->intra_vlc_format)
+ init_uni_ac_vlc(&rl_mpeg2, uni_mpeg2_ac_vlc_len);
/* build unified dc encoding tables */
for(i=-255; i<256; i++)
@@ -840,9 +845,14 @@ void ff_mpeg1_encode_init(MpegEncContext *s)
s->min_qcoeff=-2047;
s->max_qcoeff= 2047;
}
- s->intra_ac_vlc_length=
+ if (s->intra_vlc_format) {
+ s->intra_ac_vlc_length=
+ s->intra_ac_vlc_last_length= uni_mpeg2_ac_vlc_len;
+ } else {
+ s->intra_ac_vlc_length=
+ s->intra_ac_vlc_last_length= uni_mpeg1_ac_vlc_len;
+ }
s->inter_ac_vlc_length=
- s->intra_ac_vlc_last_length=
s->inter_ac_vlc_last_length= uni_mpeg1_ac_vlc_len;
}
@@ -889,7 +899,7 @@ static void mpeg1_encode_block(MpegEncContext *s,
{
int alevel, level, last_non_zero, dc, diff, i, j, run, last_index, sign;
int code, component;
-// RLTable *rl = &rl_mpeg1;
+ const uint16_t (*table_vlc)[2] = rl_mpeg1.table_vlc;
last_index = s->block_last_index[n];
@@ -901,12 +911,8 @@ static void mpeg1_encode_block(MpegEncContext *s,
encode_dc(s, diff, component);
s->last_dc[component] = dc;
i = 1;
-/*
if (s->intra_vlc_format)
- rl = &rl_mpeg2;
- else
- rl = &rl_mpeg1;
-*/
+ table_vlc = rl_mpeg2.table_vlc;
} else {
/* encode the first coefficient : needs to be done here because
it is handled slightly differently */
@@ -941,14 +947,13 @@ static void mpeg1_encode_block(MpegEncContext *s,
MASK_ABS(sign, alevel)
sign&=1;
-// code = get_rl_index(rl, 0, run, alevel);
if (alevel <= mpeg1_max_level[0][run]){
code= mpeg1_index_run[0][run] + alevel - 1;
/* store the vlc & sign at once */
- put_bits(&s->pb, mpeg1_vlc[code][1]+1, (mpeg1_vlc[code][0]<<1) + sign);
+ put_bits(&s->pb, table_vlc[code][1]+1, (table_vlc[code][0]<<1) + sign);
} else {
/* escape seems to be pretty rare <5% so i dont optimize it */
- put_bits(&s->pb, mpeg1_vlc[111/*rl->n*/][1], mpeg1_vlc[111/*rl->n*/][0]);
+ put_bits(&s->pb, table_vlc[111][1], table_vlc[111][0]);
/* escape: only clip in this case */
put_bits(&s->pb, 6, run);
if(s->codec_id == CODEC_ID_MPEG1VIDEO){
@@ -969,7 +974,7 @@ static void mpeg1_encode_block(MpegEncContext *s,
}
}
/* end of block */
- put_bits(&s->pb, 2, 0x2);
+ put_bits(&s->pb, table_vlc[112][1], table_vlc[112][0]);
}
#endif //CONFIG_ENCODERS