Hi,
the attached patch should fix this bug.

-- 
Anton Khirnov
Index: xine-lib-1.2-1.2.4/src/video_out/video_out_vaapi.c
===================================================================
--- xine-lib-1.2-1.2.4.orig/src/video_out/video_out_vaapi.c	2014-02-23 13:57:29.000000000 +0000
+++ xine-lib-1.2-1.2.4/src/video_out/video_out_vaapi.c	2014-02-23 14:05:16.643014434 +0000
@@ -1151,14 +1151,14 @@
   enum CodecID codec_id;
 #endif
 } conversion_map[] = {
-  {IMGFMT_VAAPI_MPEG2,     PIX_FMT_VAAPI_VLD,  CODEC_ID_MPEG2VIDEO},
-  {IMGFMT_VAAPI_MPEG2_IDCT,PIX_FMT_VAAPI_IDCT, CODEC_ID_MPEG2VIDEO},
-  {IMGFMT_VAAPI_MPEG2_MOCO,PIX_FMT_VAAPI_MOCO, CODEC_ID_MPEG2VIDEO},
-  {IMGFMT_VAAPI_MPEG4,     PIX_FMT_VAAPI_VLD,  CODEC_ID_MPEG4},
-  {IMGFMT_VAAPI_H263,      PIX_FMT_VAAPI_VLD,  CODEC_ID_H263},
-  {IMGFMT_VAAPI_H264,      PIX_FMT_VAAPI_VLD,  CODEC_ID_H264},
-  {IMGFMT_VAAPI_WMV3,      PIX_FMT_VAAPI_VLD,  CODEC_ID_WMV3},
-  {IMGFMT_VAAPI_VC1,       PIX_FMT_VAAPI_VLD,  CODEC_ID_VC1},
+  {IMGFMT_VAAPI_MPEG2,     PIX_FMT_VAAPI_VLD,  AV_CODEC_ID_MPEG2VIDEO},
+  {IMGFMT_VAAPI_MPEG2_IDCT,PIX_FMT_VAAPI_IDCT, AV_CODEC_ID_MPEG2VIDEO},
+  {IMGFMT_VAAPI_MPEG2_MOCO,PIX_FMT_VAAPI_MOCO, AV_CODEC_ID_MPEG2VIDEO},
+  {IMGFMT_VAAPI_MPEG4,     PIX_FMT_VAAPI_VLD,  AV_CODEC_ID_MPEG4},
+  {IMGFMT_VAAPI_H263,      PIX_FMT_VAAPI_VLD,  AV_CODEC_ID_H263},
+  {IMGFMT_VAAPI_H264,      PIX_FMT_VAAPI_VLD,  AV_CODEC_ID_H264},
+  {IMGFMT_VAAPI_WMV3,      PIX_FMT_VAAPI_VLD,  AV_CODEC_ID_WMV3},
+  {IMGFMT_VAAPI_VC1,       PIX_FMT_VAAPI_VLD,  AV_CODEC_ID_VC1},
   {0, PIX_FMT_NONE}
 };
 
Index: xine-lib-1.2-1.2.4/src/dxr3/ffmpeg_encoder.c
===================================================================
--- xine-lib-1.2-1.2.4.orig/src/dxr3/ffmpeg_encoder.c	2013-09-18 10:04:54.000000000 +0000
+++ xine-lib-1.2-1.2.4/src/dxr3/ffmpeg_encoder.c	2014-02-23 14:11:57.853916862 +0000
@@ -49,11 +49,6 @@
 
 #include "../combined/ffmpeg/ffmpeg_compat.h"
 
-/* buffer size for encoded mpeg1 stream; will hold one intra frame
- * at 640x480 typical sizes are <50 kB. 512 kB should be plenty */
-#define DEFAULT_BUFFER_SIZE 512*1024
-
-
 /* functions required by encoder api */
 static int lavc_on_update_format(dxr3_driver_t *drv, dxr3_frame_t *frame);
 static int lavc_on_display_frame(dxr3_driver_t *drv, dxr3_frame_t *frame);
@@ -64,7 +59,6 @@
   encoder_data_t     encoder_data;
   AVCodecContext     *context;         /* handle for encoding */
   int                width, height;    /* width and height of the video frame */
-  uint8_t            *ffmpeg_buffer;   /* lavc buffer */
   AVFrame            *picture;         /* picture to be encoded */
   uint8_t            *out[3];          /* aligned buffer for YV12 data */
   uint8_t            *buf;     /* base address of YV12 buffer */
@@ -142,7 +136,7 @@
   }
 
   /* get mpeg codec handle */
-  codec = avcodec_find_encoder(CODEC_ID_MPEG1VIDEO);
+  codec = avcodec_find_encoder(AV_CODEC_ID_MPEG1VIDEO);
   if (!codec) {
     xprintf(drv->class->xine, XINE_VERBOSITY_LOG,
       "dxr3_mpeg_encoder: lavc MPEG1 codec not found\n");
@@ -225,20 +219,13 @@
   }
   lprintf("dxr3_mpeg_encoder: lavc MPEG1 codec opened.\n");
 
-  if (!this->ffmpeg_buffer)
-    this->ffmpeg_buffer = (unsigned char *)malloc(DEFAULT_BUFFER_SIZE); /* why allocate more than needed ?! */
-  if (!this->ffmpeg_buffer) {
-    xprintf(drv->class->xine, XINE_VERBOSITY_LOG,
-      "dxr3_mpeg_encoder: Couldn't allocate temp buffer for mpeg data\n");
-    return 0;
-  }
-
   return 1;
 }
 
 static int lavc_on_display_frame(dxr3_driver_t *drv, dxr3_frame_t *frame)
 {
-  int size;
+  AVPacket pkt = { 0 };
+  int ret, got_output;
   lavc_data_t* this = (lavc_data_t *)drv->enc;
   ssize_t written;
 
@@ -254,25 +241,28 @@
   lavc_prepare_frame(this, drv, frame);
 
   /* do the encoding */
-  size = avcodec_encode_video(this->context, this->ffmpeg_buffer, DEFAULT_BUFFER_SIZE, this->picture);
+  ret = avcodec_encode_video2(this->context, &pkt, this->picture, &got_output);
 
   frame->vo_frame.free(&frame->vo_frame);
 
-  if (size < 0) {
+  if (ret < 0) {
       xprintf(drv->class->xine, XINE_VERBOSITY_LOG,
         "dxr3_mpeg_encoder: encoding failed\n");
       return 0;
-  }
+  } else if (!got_output)
+      return 1;
 
-  written = write(drv->fd_video, this->ffmpeg_buffer, size);
+  written = write(drv->fd_video, pkt.data, pkt.size);
   if (written < 0) {
+      av_packet_unref(&pkt);
       xprintf(drv->class->xine, XINE_VERBOSITY_LOG,
         "dxr3_mpeg_encoder: video device write failed (%s)\n", strerror(errno));
       return 0;
     }
-  if (written != size)
+  if (written != pkt.size)
       xprintf(drv->class->xine, XINE_VERBOSITY_LOG,
-        "dxr3_mpeg_encoder: Could only write %zd of %d mpeg bytes.\n", written, size);
+        "dxr3_mpeg_encoder: Could only write %zd of %d mpeg bytes.\n", written, pkt.size);
+  av_packet_unref(&pkt);
   return 1;
 }
 
Index: xine-lib-1.2-1.2.4/src/combined/ffmpeg/ff_video_decoder.c
===================================================================
--- xine-lib-1.2-1.2.4.orig/src/combined/ffmpeg/ff_video_decoder.c	2013-09-23 20:56:56.000000000 +0000
+++ xine-lib-1.2-1.2.4/src/combined/ffmpeg/ff_video_decoder.c	2014-02-23 14:13:15.199826199 +0000
@@ -593,7 +593,7 @@
 
 #ifdef DEPRECATED_AVCODEC_THREAD_INIT
   if (this->class->thread_count > 1) {
-    if (this->codec->id != CODEC_ID_SVQ3)
+    if (this->codec->id != AV_CODEC_ID_SVQ3)
       this->context->thread_count = this->class->thread_count;
   }
 #endif
@@ -644,7 +644,7 @@
     return;
   }
 
-  if (this->codec->id == CODEC_ID_VC1 &&
+  if (this->codec->id == AV_CODEC_ID_VC1 &&
       (!this->bih.biWidth || !this->bih.biHeight)) {
     /* VC1 codec must be re-opened with correct width and height. */
     avcodec_close(this->context);
@@ -663,7 +663,7 @@
 
 #ifndef DEPRECATED_AVCODEC_THREAD_INIT
   if (this->class->thread_count > 1) {
-    if (this->codec->id != CODEC_ID_SVQ3
+    if (this->codec->id != AV_CODEC_ID_SVQ3
 	&& avcodec_thread_init(this->context, this->class->thread_count) != -1)
       this->context->thread_count = this->class->thread_count;
   }
@@ -793,12 +793,12 @@
 
   /* Allow post processing on mpeg-4 (based) codecs */
   switch(this->codec->id) {
-    case CODEC_ID_MPEG4:
-    case CODEC_ID_MSMPEG4V1:
-    case CODEC_ID_MSMPEG4V2:
-    case CODEC_ID_MSMPEG4V3:
-    case CODEC_ID_WMV1:
-    case CODEC_ID_WMV2:
+    case AV_CODEC_ID_MPEG4:
+    case AV_CODEC_ID_MSMPEG4V1:
+    case AV_CODEC_ID_MSMPEG4V2:
+    case AV_CODEC_ID_MSMPEG4V3:
+    case AV_CODEC_ID_WMV1:
+    case AV_CODEC_ID_WMV2:
       this->pp_available = 1;
       break;
     default:
@@ -1106,7 +1106,7 @@
     uint8_t *outbuf;
     int      outsize;
 
-    parser_context = av_parser_init(CODEC_ID_VC1);
+    parser_context = av_parser_init(AV_CODEC_ID_VC1);
     if (!parser_context) {
       xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
               "ffmpeg_video_dec: couldn't init VC1 parser\n");

Reply via email to