support omiting various headers in mpeg4 as WMP seems to have difficulty with them

based upon 27_WMP_compatibility_with_ISOMPEG4.patch by (Calcium | calcium nurs or jp)
  indention fixed
  uses workaround_bugs instead of strict_std_compliancy as WMP is not the reference implementation

Originally committed as revision 4069 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Michael Niedermayer 2005-03-23 11:39:38 +00:00
parent 0d23cb8439
commit 59fa3f96f4
3 changed files with 23 additions and 11 deletions

View File

@ -3265,6 +3265,7 @@ static void opt_output_file(const char *filename)
video_enc->rc_eq = video_rc_eq; video_enc->rc_eq = video_rc_eq;
video_enc->debug = debug; video_enc->debug = debug;
video_enc->debug_mv = debug_mv; video_enc->debug_mv = debug_mv;
video_enc->workaround_bugs = workaround_bugs;
video_enc->thread_count = thread_count; video_enc->thread_count = thread_count;
p= video_rc_override_string; p= video_rc_override_string;
for(i=0; p; i++){ for(i=0; p; i++){

View File

@ -17,7 +17,7 @@ extern "C" {
#define FFMPEG_VERSION_INT 0x000409 #define FFMPEG_VERSION_INT 0x000409
#define FFMPEG_VERSION "0.4.9-pre1" #define FFMPEG_VERSION "0.4.9-pre1"
#define LIBAVCODEC_BUILD 4747 #define LIBAVCODEC_BUILD 4748
#define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT #define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT
#define LIBAVCODEC_VERSION FFMPEG_VERSION #define LIBAVCODEC_VERSION FFMPEG_VERSION
@ -909,7 +909,7 @@ typedef struct AVCodecContext {
/** /**
* workaround bugs in encoders which sometimes cannot be detected automatically. * workaround bugs in encoders which sometimes cannot be detected automatically.
* - encoding: unused * - encoding: set by user
* - decoding: set by user * - decoding: set by user
*/ */
int workaround_bugs; int workaround_bugs;
@ -927,6 +927,7 @@ typedef struct AVCodecContext {
#define FF_BUG_EDGE 1024 #define FF_BUG_EDGE 1024
#define FF_BUG_HPEL_CHROMA 2048 #define FF_BUG_HPEL_CHROMA 2048
#define FF_BUG_DC_CLIP 4096 #define FF_BUG_DC_CLIP 4096
#define FF_BUG_MS 8192 ///< workaround various bugs in microsofts broken decoders
//#define FF_BUG_FAKE_SCALABILITY 16 //autodetection should work 100% //#define FF_BUG_FAKE_SCALABILITY 16 //autodetection should work 100%
/** /**

View File

@ -2021,6 +2021,7 @@ void h263_encode_init(MpegEncContext *s)
s->avctx->extradata= av_malloc(1024); s->avctx->extradata= av_malloc(1024);
init_put_bits(&s->pb, s->avctx->extradata, 1024); init_put_bits(&s->pb, s->avctx->extradata, 1024);
if(!(s->workaround_bugs & FF_BUG_MS))
mpeg4_encode_visual_object_header(s); mpeg4_encode_visual_object_header(s);
mpeg4_encode_vol_header(s, 0, 0); mpeg4_encode_vol_header(s, 0, 0);
@ -2320,9 +2321,13 @@ static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_n
put_bits(&s->pb, 1, 0); /* random access vol */ put_bits(&s->pb, 1, 0); /* random access vol */
put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */ put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */
if(s->workaround_bugs & FF_BUG_MS) {
put_bits(&s->pb, 1, 0); /* is obj layer id= no */
} else {
put_bits(&s->pb, 1, 1); /* is obj layer id= yes */ put_bits(&s->pb, 1, 1); /* is obj layer id= yes */
put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */ put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
put_bits(&s->pb, 3, 1); /* is obj layer priority */ put_bits(&s->pb, 3, 1); /* is obj layer priority */
}
aspect_to_info(s, s->avctx->sample_aspect_ratio); aspect_to_info(s, s->avctx->sample_aspect_ratio);
@ -2332,10 +2337,14 @@ static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_n
put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den); put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
} }
if(s->workaround_bugs & FF_BUG_MS) { //
put_bits(&s->pb, 1, 0); /* vol control parameters= no @@@ */
} else {
put_bits(&s->pb, 1, 1); /* vol control parameters= yes */ put_bits(&s->pb, 1, 1); /* vol control parameters= yes */
put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */ put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */
put_bits(&s->pb, 1, s->low_delay); put_bits(&s->pb, 1, s->low_delay);
put_bits(&s->pb, 1, 0); /* vbv parameters= no */ put_bits(&s->pb, 1, 0); /* vbv parameters= no */
}
put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */ put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
put_bits(&s->pb, 1, 1); /* marker bit */ put_bits(&s->pb, 1, 1); /* marker bit */
@ -2405,6 +2414,7 @@ void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
if(s->strict_std_compliance < 2 || picture_number==0) //HACK, the reference sw is buggy if(s->strict_std_compliance < 2 || picture_number==0) //HACK, the reference sw is buggy
mpeg4_encode_vol_header(s, 0, 0); mpeg4_encode_vol_header(s, 0, 0);
} }
if(!(s->workaround_bugs & FF_BUG_MS))
mpeg4_encode_gop_header(s); mpeg4_encode_gop_header(s);
} }