- Bug fix on MV prediction for MPEG4 caused by new H.263 GOB code.

Originally committed as revision 215 to svn://svn.ffmpeg.org/ffmpeg/trunk
pull/126/head
Juanjo 23 years ago
parent 102d39088b
commit 8547282b6c
  1. 44
      libavcodec/h263.c

@ -782,29 +782,32 @@ int h263_decode_mb(MpegEncContext *s,
unsigned int gfid; unsigned int gfid;
/* Check for GOB Start Code */ /* Check for GOB Start Code */
val = show_bits(&s->gb, 16); if (s->mb_x == 0) {
val = show_bits(&s->gb, 16);
if (val == 0) { if (val == 0) {
/* We have a GBSC probably with GSTUFF */ /* We have a GBSC probably with GSTUFF */
//skip_bits(&s->gb, 16); /* Drop the zeros */ skip_bits(&s->gb, 16); /* Drop the zeros */
while (get_bits1(&s->gb) == 0); /* Seek the '1' bit */ while (get_bits1(&s->gb) == 0); /* Seek the '1' bit */
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr,"\nGOB Start Code at MB %d\n", fprintf(stderr,"\nGOB Start Code at MB %d\n",
(s->mb_y * s->mb_width) + s->mb_x); (s->mb_y * s->mb_width) + s->mb_x);
#endif #endif
s->gob_number = get_bits(&s->gb, 5); /* GN */ s->gob_number = get_bits(&s->gb, 5); /* GN */
gfid = get_bits(&s->gb, 2); /* GFID */ gfid = get_bits(&s->gb, 2); /* GFID */
s->qscale = get_bits(&s->gb, 5); /* GQUANT */ s->qscale = get_bits(&s->gb, 5); /* GQUANT */
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", gn, gfid, s->qscale); fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", gn, gfid, s->qscale);
#endif #endif
}
} }
/* FIXME: In the future H.263+ will have intra prediction */
if (s->mb_y == s->gob_number) /* and we are gonna need another way to detect MPEG4 */
s->first_gob_line = 1; if (!s->h263_pred) {
else if (s->mb_y == s->gob_number)
s->first_gob_line = 0; s->first_gob_line = 1;
else
s->first_gob_line = 0;
}
if (s->pict_type == P_TYPE) { if (s->pict_type == P_TYPE) {
if (get_bits1(&s->gb)) { if (get_bits1(&s->gb)) {
/* skip mb */ /* skip mb */
@ -1215,10 +1218,9 @@ int h263_decode_picture_header(MpegEncContext *s)
skip_bits1(&s->gb); /* camera off */ skip_bits1(&s->gb); /* camera off */
skip_bits1(&s->gb); /* freeze picture release off */ skip_bits1(&s->gb); /* freeze picture release off */
/* Reset GOB data */ /* Reset GOB number */
s->gob_number = 0; s->gob_number = 0;
s->first_gob_line = 0;
format = get_bits(&s->gb, 3); format = get_bits(&s->gb, 3);
if (format != 7) { if (format != 7) {

Loading…
Cancel
Save