mirror of https://git.ffmpeg.org/ffmpeg.git
there are divx5? encoded files without a userdata section but with b-frames :(
Originally committed as revision 446 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
e71a4f7425
commit
7aaf3b98fc
|
@ -2747,7 +2747,6 @@ int mpeg4_decode_picture_header(MpegEncContext * s)
|
||||||
{
|
{
|
||||||
int time_incr, startcode, state, v;
|
int time_incr, startcode, state, v;
|
||||||
int time_increment;
|
int time_increment;
|
||||||
int vol_control=-1;
|
|
||||||
|
|
||||||
redo:
|
redo:
|
||||||
/* search next start code */
|
/* search next start code */
|
||||||
|
@ -2791,7 +2790,7 @@ int mpeg4_decode_picture_header(MpegEncContext * s)
|
||||||
skip_bits(&s->gb, 8); // par_height
|
skip_bits(&s->gb, 8); // par_height
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((vol_control=get_bits1(&s->gb))) { /* vol control parameter */
|
if ((s->vol_control_parameters=get_bits1(&s->gb))) { /* vol control parameter */
|
||||||
int chroma_format= get_bits(&s->gb, 2);
|
int chroma_format= get_bits(&s->gb, 2);
|
||||||
if(chroma_format!=1){
|
if(chroma_format!=1){
|
||||||
printf("illegal chroma format\n");
|
printf("illegal chroma format\n");
|
||||||
|
@ -3000,6 +2999,10 @@ int mpeg4_decode_picture_header(MpegEncContext * s)
|
||||||
}
|
}
|
||||||
|
|
||||||
s->pict_type = get_bits(&s->gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */
|
s->pict_type = get_bits(&s->gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */
|
||||||
|
if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0){
|
||||||
|
printf("low_delay flag set, but shouldnt, clearing it\n");
|
||||||
|
s->low_delay=0;
|
||||||
|
}
|
||||||
// printf("pic: %d, qpel:%d\n", s->pict_type, s->quarter_sample);
|
// printf("pic: %d, qpel:%d\n", s->pict_type, s->quarter_sample);
|
||||||
time_incr=0;
|
time_incr=0;
|
||||||
while (get_bits1(&s->gb) != 0)
|
while (get_bits1(&s->gb) != 0)
|
||||||
|
@ -3109,9 +3112,8 @@ int mpeg4_decode_picture_header(MpegEncContext * s)
|
||||||
}
|
}
|
||||||
/* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/
|
/* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/
|
||||||
// note we cannot detect divx5 without b-frames easyly (allthough its buggy too)
|
// note we cannot detect divx5 without b-frames easyly (allthough its buggy too)
|
||||||
if(s->vo_type==0 && vol_control==0 && s->divx_version==0){
|
if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
|
||||||
if(s->picture_number==0)
|
printf("looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
|
||||||
printf("looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
|
|
||||||
s->low_delay=1;
|
s->low_delay=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -159,7 +159,9 @@ int MPV_common_init(MpegEncContext *s)
|
||||||
s->next_picture_base[i] = pict;
|
s->next_picture_base[i] = pict;
|
||||||
s->next_picture[i] = pict + pict_start;
|
s->next_picture[i] = pict + pict_start;
|
||||||
|
|
||||||
if (s->has_b_frames) {
|
if (s->has_b_frames || s->codec_id==CODEC_ID_MPEG4) {
|
||||||
|
/* Note the MPEG4 stuff is here cuz of buggy encoders which dont set the low_delay flag but
|
||||||
|
do low-delay encoding, so we cant allways distinguish b-frame containing streams from low_delay streams */
|
||||||
pict = av_mallocz(c_size);
|
pict = av_mallocz(c_size);
|
||||||
if (pict == NULL)
|
if (pict == NULL)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
|
@ -313,6 +313,7 @@ typedef struct MpegEncContext {
|
||||||
int resync_x_pos;
|
int resync_x_pos;
|
||||||
int low_delay; /* no reordering needed / has no b-frames */
|
int low_delay; /* no reordering needed / has no b-frames */
|
||||||
int vo_type;
|
int vo_type;
|
||||||
|
int vol_control_parameters; /* does the stream contain the low_delay flag, used to workaround buggy encoders */
|
||||||
|
|
||||||
/* divx specific, used to workaround (many) bugs in divx5 */
|
/* divx specific, used to workaround (many) bugs in divx5 */
|
||||||
int divx_version;
|
int divx_version;
|
||||||
|
|
Loading…
Reference in New Issue