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");