summaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2011-09-14 16:03:52 +0000
committerjstebbins <[email protected]>2011-09-14 16:03:52 +0000
commit3cdb1f293da7bb6e1f506c899ced038068aeeddf (patch)
tree53552ce38e0c8f23675cbf71f4dc68cc302315b7 /contrib
parentace57e1b754f84cad9603e7ed14aa9c6bb705461 (diff)
Improve mpeg PS support
Adds support for MPEG-1 PS, HDDVD EVOB, and video codecs other than mpeg1/2 in PS Improves probing of unknown stream types by using Libav's probing utilities Use Libav to probe for dts profile in TS and PS files when profile is unknown Improves framerate detection (improved telecine detection) Fixes preview generation for mpeg video that has only a single sequence header Patches Libav to handle VC-1 pulldown flags properly Improve PS and TS stream log information git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@4220 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'contrib')
-rw-r--r--contrib/ffmpeg/A05-vc1-pulldown.patch96
1 files changed, 96 insertions, 0 deletions
diff --git a/contrib/ffmpeg/A05-vc1-pulldown.patch b/contrib/ffmpeg/A05-vc1-pulldown.patch
new file mode 100644
index 000000000..ff93bd119
--- /dev/null
+++ b/contrib/ffmpeg/A05-vc1-pulldown.patch
@@ -0,0 +1,96 @@
+diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c
+index 243bef5..d20b000 100644
+--- a/libavcodec/vc1.c
++++ b/libavcodec/vc1.c
+@@ -504,6 +504,10 @@ static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb)
+ v->s.avctx->time_base.den = ff_vc1_fps_nr[nr - 1] * 1000;
+ }
+ }
++ if(v->broadcast) { // Pulldown may be present
++ v->s.avctx->time_base.den *= 2;
++ v->s.avctx->ticks_per_frame = 2;
++ }
+ }
+
+ if(get_bits1(gb)){
+@@ -821,7 +825,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
+ case 4:
+ v->s.pict_type = AV_PICTURE_TYPE_P; // skipped pic
+ v->p_frame_skipped = 1;
+- return 0;
++ break;
+ }
+ if(v->tfcntrflag)
+ skip_bits(gb, 8);
+@@ -830,13 +834,16 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
+ v->rptfrm = get_bits(gb, 2);
+ } else {
+ v->tff = get_bits1(gb);
+- v->rptfrm = get_bits1(gb);
++ v->rff = get_bits1(gb);
+ }
+ }
+ if(v->panscanflag) {
+ av_log_missing_feature(v->s.avctx, "Pan-scan", 0);
+ //...
+ }
++ if(v->p_frame_skipped) {
++ return 0;
++ }
+ v->rnd = get_bits1(gb);
+ if(v->interlace)
+ v->uvsamp = get_bits1(gb);
+diff --git a/libavcodec/vc1_parser.c b/libavcodec/vc1_parser.c
+index 27ff1bd..4151119 100644
+--- a/libavcodec/vc1_parser.c
++++ b/libavcodec/vc1_parser.c
+@@ -45,6 +45,7 @@ static void vc1_extract_headers(AVCodecParserContext *s, AVCodecContext *avctx,
+ vpc->v.s.avctx = avctx;
+ vpc->v.parse_only = 1;
+ next = buf;
++ s->repeat_pict = 0;
+
+ for(start = buf, end = buf + buf_size; next < end; start = next){
+ int buf2_size, size;
+@@ -73,6 +74,18 @@ static void vc1_extract_headers(AVCodecParserContext *s, AVCodecContext *avctx,
+ else
+ s->pict_type = vpc->v.s.pict_type;
+
++ // process pulldown flags
++ s->repeat_pict = 1;
++ // Pulldown flags are only valid when 'broadcast' has been set.
++ // So ticks_per_frame will be 2
++ if (vpc->v.rff){
++ // repeat field
++ s->repeat_pict = 2;
++ }else if (vpc->v.rptfrm){
++ // repeat frames
++ s->repeat_pict = vpc->v.rptfrm * 2 + 1;
++ }
++
+ break;
+ }
+ }
+diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c
+index ae7906d..58cb8c0 100644
+--- a/libavcodec/vc1dec.c
++++ b/libavcodec/vc1dec.c
+@@ -3698,6 +3698,18 @@ static int vc1_decode_frame(AVCodecContext *avctx,
+ av_log(v->s.avctx, AV_LOG_WARNING, "Sprite decoder: expected I-frame\n");
+ }
+
++ // process pulldown flags
++ s->current_picture_ptr->repeat_pict = 0;
++ // Pulldown flags are only valid when 'broadcast' has been set.
++ // So ticks_per_frame will be 2
++ if (v->rff){
++ // repeat field
++ s->current_picture_ptr->repeat_pict = 1;
++ }else if (v->rptfrm){
++ // repeat frames
++ s->current_picture_ptr->repeat_pict = v->rptfrm * 2;
++ }
++
+ // for skipping the frame
+ s->current_picture.f.pict_type = s->pict_type;
+ s->current_picture.f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;