h261, h263 decoders: convert to RL_VLC.
Some additional optimizations in following patch. Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
This commit is contained in:
parent
3efc174fd6
commit
da0a670b3c
@ -28,6 +28,5 @@ void ff_flv_encode_picture_header(MpegEncContext * s, int picture_number);
|
|||||||
void ff_flv2_encode_ac_esc(PutBitContext *pb, int slevel, int level, int run, int last);
|
void ff_flv2_encode_ac_esc(PutBitContext *pb, int slevel, int level, int run, int last);
|
||||||
|
|
||||||
int ff_flv_decode_picture_header(MpegEncContext *s);
|
int ff_flv_decode_picture_header(MpegEncContext *s);
|
||||||
void ff_flv2_decode_ac_esc(GetBitContext *gb, int *level, int *run, int *last);
|
|
||||||
|
|
||||||
#endif /* AVCODEC_FLV_H */
|
#endif /* AVCODEC_FLV_H */
|
||||||
|
@ -22,18 +22,6 @@
|
|||||||
#include "flv.h"
|
#include "flv.h"
|
||||||
#include "libavutil/imgutils.h"
|
#include "libavutil/imgutils.h"
|
||||||
|
|
||||||
void ff_flv2_decode_ac_esc(GetBitContext *gb, int *level, int *run, int *last)
|
|
||||||
{
|
|
||||||
int is11 = get_bits1(gb);
|
|
||||||
*last = get_bits1(gb);
|
|
||||||
*run = get_bits(gb, 6);
|
|
||||||
if (is11) {
|
|
||||||
*level = get_sbits(gb, 11);
|
|
||||||
} else {
|
|
||||||
*level = get_sbits(gb, 7);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int ff_flv_decode_picture_header(MpegEncContext *s)
|
int ff_flv_decode_picture_header(MpegEncContext *s)
|
||||||
{
|
{
|
||||||
int format, width, height;
|
int format, width, height;
|
||||||
|
@ -258,7 +258,7 @@ static int decode_mv_component(GetBitContext *gb, int v)
|
|||||||
static int h261_decode_block(H261Context *h, int16_t *block, int n, int coded)
|
static int h261_decode_block(H261Context *h, int16_t *block, int n, int coded)
|
||||||
{
|
{
|
||||||
MpegEncContext *const s = &h->s;
|
MpegEncContext *const s = &h->s;
|
||||||
int code, level, i, j, run;
|
int level, i, j, run;
|
||||||
RLTable *rl = &ff_h261_rl_tcoeff;
|
RLTable *rl = &ff_h261_rl_tcoeff;
|
||||||
const uint8_t *scan_table;
|
const uint8_t *scan_table;
|
||||||
|
|
||||||
@ -303,27 +303,32 @@ static int h261_decode_block(H261Context *h, int16_t *block, int n, int coded)
|
|||||||
s->block_last_index[n] = i - 1;
|
s->block_last_index[n] = i - 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
OPEN_READER(re, &s->gb);
|
||||||
for (;;) {
|
for (;;) {
|
||||||
code = get_vlc2(&s->gb, rl->vlc.table, TCOEFF_VLC_BITS, 2);
|
UPDATE_CACHE(re, &s->gb);
|
||||||
if (code < 0) {
|
GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TCOEFF_VLC_BITS, 2, 0);
|
||||||
|
if (run == 66 && level) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n",
|
av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n",
|
||||||
s->mb_x, s->mb_y);
|
s->mb_x, s->mb_y);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (code == rl->n) {
|
if (run == 66) {
|
||||||
/* escape */
|
/* escape */
|
||||||
/* The remaining combinations of (run, level) are encoded with a
|
/* The remaining combinations of (run, level) are encoded with a
|
||||||
* 20-bit word consisting of 6 bits escape, 6 bits run and 8 bits
|
* 20-bit word consisting of 6 bits escape, 6 bits run and 8 bits
|
||||||
* level. */
|
* level. */
|
||||||
run = get_bits(&s->gb, 6);
|
run = SHOW_UBITS(re, &s->gb, 6);
|
||||||
level = get_sbits(&s->gb, 8);
|
SKIP_CACHE(re, &s->gb, 6);
|
||||||
} else if (code == 0) {
|
level = SHOW_SBITS(re, &s->gb, 8);
|
||||||
|
SKIP_COUNTER(re, &s->gb, 6 + 8);
|
||||||
|
} else if (level == 0) {
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
run = rl->table_run[code];
|
run--;
|
||||||
level = rl->table_level[code];
|
if (SHOW_UBITS(re, &s->gb, 1))
|
||||||
if (get_bits1(&s->gb))
|
|
||||||
level = -level;
|
level = -level;
|
||||||
|
SKIP_COUNTER(re, &s->gb, 1);
|
||||||
}
|
}
|
||||||
i += run;
|
i += run;
|
||||||
if (i >= 64) {
|
if (i >= 64) {
|
||||||
@ -335,6 +340,8 @@ static int h261_decode_block(H261Context *h, int16_t *block, int n, int coded)
|
|||||||
block[j] = level;
|
block[j] = level;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
CLOSE_READER(re, &s->gb);
|
||||||
|
}
|
||||||
s->block_last_index[n] = i - 1;
|
s->block_last_index[n] = i - 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -418,7 +418,7 @@ static void h263_decode_dquant(MpegEncContext *s){
|
|||||||
static int h263_decode_block(MpegEncContext * s, int16_t * block,
|
static int h263_decode_block(MpegEncContext * s, int16_t * block,
|
||||||
int n, int coded)
|
int n, int coded)
|
||||||
{
|
{
|
||||||
int code, level, i, j, last, run;
|
int level, i, j, last, run;
|
||||||
RLTable *rl = &ff_h263_rl_inter;
|
RLTable *rl = &ff_h263_rl_inter;
|
||||||
const uint8_t *scan_table;
|
const uint8_t *scan_table;
|
||||||
GetBitContext gb= s->gb;
|
GetBitContext gb= s->gb;
|
||||||
@ -479,40 +479,66 @@ static int h263_decode_block(MpegEncContext * s, int16_t * block,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
retry:
|
retry:
|
||||||
|
{
|
||||||
|
OPEN_READER(re, &s->gb);
|
||||||
for(;;) {
|
for(;;) {
|
||||||
code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
|
UPDATE_CACHE(re, &s->gb);
|
||||||
if (code < 0){
|
GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
|
||||||
|
if (run == 66 && level){
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
|
av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (code == rl->n) {
|
if (run == 66) {
|
||||||
/* escape */
|
/* escape */
|
||||||
if (CONFIG_FLV_DECODER && s->h263_flv > 1) {
|
if (CONFIG_FLV_DECODER && s->h263_flv > 1) {
|
||||||
ff_flv2_decode_ac_esc(&s->gb, &level, &run, &last);
|
int is11 = SHOW_UBITS(re, &s->gb, 1);
|
||||||
|
SKIP_CACHE(re, &s->gb, 1);
|
||||||
|
last = SHOW_UBITS(re, &s->gb, 1);
|
||||||
|
SKIP_CACHE(re, &s->gb, 1);
|
||||||
|
run = SHOW_UBITS(re, &s->gb, 6);
|
||||||
|
if (is11) {
|
||||||
|
SKIP_COUNTER(re, &s->gb, 6);
|
||||||
|
UPDATE_CACHE(re, &s->gb);
|
||||||
|
level = SHOW_SBITS(re, &s->gb, 11);
|
||||||
|
SKIP_COUNTER(re, &s->gb, 1 + 1 + 6 + 11);
|
||||||
} else {
|
} else {
|
||||||
last = get_bits1(&s->gb);
|
SKIP_CACHE(re, &s->gb, 6);
|
||||||
run = get_bits(&s->gb, 6);
|
level = SHOW_SBITS(re, &s->gb, 7);
|
||||||
level = (int8_t)get_bits(&s->gb, 8);
|
SKIP_COUNTER(re, &s->gb, 1 + 1 + 6 + 7);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
last = SHOW_UBITS(re, &s->gb, 1);
|
||||||
|
SKIP_CACHE(re, &s->gb, 1);
|
||||||
|
run = SHOW_UBITS(re, &s->gb, 6);
|
||||||
|
SKIP_CACHE(re, &s->gb, 6);
|
||||||
|
level = (int8_t)SHOW_UBITS(re, &s->gb, 8);
|
||||||
|
SKIP_COUNTER(re, &s->gb, 1 + 6 + 8);
|
||||||
if(level == -128){
|
if(level == -128){
|
||||||
|
UPDATE_CACHE(re, &s->gb);
|
||||||
if (s->codec_id == AV_CODEC_ID_RV10) {
|
if (s->codec_id == AV_CODEC_ID_RV10) {
|
||||||
/* XXX: should patch encoder too */
|
/* XXX: should patch encoder too */
|
||||||
level = get_sbits(&s->gb, 12);
|
level = SHOW_SBITS(re, &s->gb, 12);
|
||||||
|
SKIP_COUNTER(re, &s->gb, 12);
|
||||||
}else{
|
}else{
|
||||||
level = get_bits(&s->gb, 5);
|
level = SHOW_UBITS(re, &s->gb, 5);
|
||||||
level |= get_sbits(&s->gb, 6)<<5;
|
SKIP_CACHE(re, &s->gb, 5);
|
||||||
|
level |= SHOW_SBITS(re, &s->gb, 6)<<5;
|
||||||
|
SKIP_COUNTER(re, &s->gb, 5 + 6);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
run = rl->table_run[code];
|
run--;
|
||||||
level = rl->table_level[code];
|
last = run >= 192;
|
||||||
last = code >= rl->last;
|
run &= 63;
|
||||||
if (get_bits1(&s->gb))
|
if (SHOW_UBITS(re, &s->gb, 1))
|
||||||
level = -level;
|
level = -level;
|
||||||
|
SKIP_COUNTER(re, &s->gb, 1);
|
||||||
}
|
}
|
||||||
i += run;
|
i += run;
|
||||||
if (i >= 64){
|
if (i >= 64){
|
||||||
if(s->alt_inter_vlc && rl == &ff_h263_rl_inter && !s->mb_intra){
|
if(s->alt_inter_vlc && rl == &ff_h263_rl_inter && !s->mb_intra){
|
||||||
|
CLOSE_READER(re, &s->gb);
|
||||||
//Looks like a hack but no, it's the way it is supposed to work ...
|
//Looks like a hack but no, it's the way it is supposed to work ...
|
||||||
rl = &ff_rl_intra_aic;
|
rl = &ff_rl_intra_aic;
|
||||||
i = 0;
|
i = 0;
|
||||||
@ -529,6 +555,8 @@ retry:
|
|||||||
break;
|
break;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
CLOSE_READER(re, &s->gb);
|
||||||
|
}
|
||||||
not_coded:
|
not_coded:
|
||||||
if (s->mb_intra && s->h263_aic) {
|
if (s->mb_intra && s->h263_aic) {
|
||||||
ff_h263_pred_acdc(s, block, n);
|
ff_h263_pred_acdc(s, block, n);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user