[ANNOUNCE] H.264 updates for VDR-1.5.9

Message ID 46D91F7D.4040107@gmx.de
State New

Commit Message

Reinhard Nissl Sept. 1, 2007, 8:14 a.m. UTC

Petri Helin wrote:

>>> I am now also able to record h.264 encoded programs, just like mpeg2 
>>> encoded, and as a result xxx.vdr files are created. But still, i cannot 
>>> replay them either.
>> Stock xine-lib-1.1.7 or higher can play those files. You may also want
>> to use vdr-xine-0.7.11 with a patched xine-lib-1.1.8 or stock xine-lib-1.2.
> Yes, I have now tried with the current xine-lib (1.1-branch) from 
> mercury and I can actually play the 001.vdr file. Nice! Yesterday I just 
> hastily tested with mplayer.

Sure, it's odd that mplayer cannot play such 001.vdr files at the
moment. I already had a look into mplayer's source and discovered why
mplayer chose the wrong codec, but I'm still waiting for someone else to
fix this issue. Digging around in the hardly known code of FFmpeg and
now also mplayer plus creating patches eats a lot of time.

>> NOTE: be aware that FFmpeg doesn't support interlaced streams properly
>> at the moment. It typically crashes after a few frames. In my
>> xine-lib.patch for xine-lib-1.1.8 I've therefore disabled decoding of
>> interlaced frames (more or less properly).
> Xine does not crash, but the playback is really slow and there are 
> "ghost effects" in the picture. Xine puts out this kind of messages all 
> the time:
> [h264 @ 0xb61168f4]concealing 6960 DC, 6960 AC, 6960 MV errors
> video_out: throwing away image with pts 455968 because it's too old 
> (diff : 574).
> video_out: throwing away image with pts 448768 because it's too old 
> (diff : 7774).
> video_out: throwing away image with pts 452368 because it's too old 
> (diff : 4174).
> ffmpeg_video_dec: error decompressing frame
> ffmpeg_video_dec: error decompressing frame

I get similar messages here. Try to play the stream in slow motion and
they should go away.

> I have an Intel Core 2 Duo E6300 (1,83GHz) which might not be enough. Do 
> you have the xine-lib.patch for disabling interlaced frames available 
> for download somewhere?

The attached patch is also part of the larger xine-lib.patch included in



diff -r 0f20b6e8ac9d src/libffmpeg/libavcodec/h264.c
--- a/src/libffmpeg/libavcodec/h264.c	Wed Aug 29 19:58:18 2007 +0200
+++ b/src/libffmpeg/libavcodec/h264.c	Sat Sep 01 10:00:43 2007 +0200
@@ -4639,8 +4639,11 @@  static int decode_slice_header(H264Conte
         s->picture_structure= PICT_FRAME;
         if(get_bits1(&s->gb)) { //field_pic_flag
-            s->picture_structure= PICT_TOP_FIELD + get_bits1(&s->gb); //bottom_field_flag
+            //s->picture_structure= PICT_TOP_FIELD + get_bits1(&s->gb); //bottom_field_flag
             av_log(h->s.avctx, AV_LOG_ERROR, "PAFF interlacing is not implemented\n");
+            s->avctx->release_buffer(s->avctx, (AVFrame*)s->current_picture_ptr);
+            s->current_picture_ptr = 0;
+            return -1;
         } else {
             s->picture_structure= PICT_FRAME;
             h->mb_aff_frame = h->sps.mb_aff;
@@ -4696,8 +4699,12 @@  static int decode_slice_header(H264Conte
     if(h->slice_type == P_TYPE || h->slice_type == SP_TYPE || h->slice_type == B_TYPE){
         if(h->slice_type == B_TYPE){
             h->direct_spatial_mv_pred= get_bits1(&s->gb);
-            if(h->sps.mb_aff && h->direct_spatial_mv_pred)
+            if(h->sps.mb_aff && h->direct_spatial_mv_pred){
                 av_log(h->s.avctx, AV_LOG_ERROR, "MBAFF + spatial direct mode is not implemented\n");
+                s->avctx->release_buffer(s->avctx, (AVFrame*)s->current_picture_ptr);
+                s->current_picture_ptr = 0;
+                return -1;
+            }
         num_ref_idx_active_override_flag= get_bits1(&s->gb);