Here is an update to Xine-lib 1.2.5. OK?
Index: Makefile =================================================================== RCS file: /home/cvs/ports/multimedia/xine-lib/Makefile,v retrieving revision 1.108 diff -u -p -u -p -r1.108 Makefile --- Makefile 8 Jan 2014 00:17:53 -0000 1.108 +++ Makefile 10 Apr 2014 02:30:18 -0000 @@ -4,13 +4,12 @@ SHARED_ONLY= Yes COMMENT= multimedia decoding library -DISTNAME= xine-lib-1.2.4 -REVISION= 0 +DISTNAME= xine-lib-1.2.5 CATEGORIES= multimedia MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=xine/} EXTRACT_SUFX= .tar.xz -SHARED_LIBS= xine 30.2 +SHARED_LIBS= xine 31.0 HOMEPAGE= http://www.xine-project.org/ @@ -21,12 +20,12 @@ PERMIT_PACKAGE_CDROM= patents PERMIT_PACKAGE_FTP= Yes WANTLIB= FLAC GL GLU ICE SDL SM X11 Xext Xinerama Xv XvMCW a52 avcodec \ - avutil bluray c cdio dca dvdnav dvdread expat faad fontconfig \ - freetype iso9660 jpeg m mad modplug mpcdec mng ogg postproc \ - pthread pthread-stubs sndio speex theora usbhid vcdinfo vorbis \ - wavpack xcb-shape xcb-shm xcb-xv xcb xdg-basedir xml2 z + avformat avutil bluray c cdio dca dvdnav dvdread expat faad \ + fontconfig freetype iso9660 jpeg m mad modplug mpcdec mng ogg \ + postproc pthread pthread-stubs sndio speex theora usbhid vcdinfo \ + vorbis wavpack xcb-shape xcb-shm xcb-xv xcb xdg-basedir xml2 z -XINEAPI_REV= 2.3 +XINEAPI_REV= 2.4 SUBST_VARS+= XINEAPI_REV MODULES= devel/gettext @@ -43,7 +42,7 @@ LIB_DEPENDS= audio/faad \ audio/speex \ audio/wavpack \ devel/sdl \ - graphics/ffmpeg>=20111126 \ + graphics/ffmpeg>=20130319 \ graphics/jpeg \ graphics/libmng \ graphics/vcdimager \ @@ -69,6 +68,7 @@ CONFIGURE_ARGS+=--disable-aalib \ --disable-optimizations \ --disable-real-codecs \ --disable-samba \ + --disable-vpx \ --disable-w32dll \ --with-external-dvdnav \ --with-fontconfig \ Index: distinfo =================================================================== RCS file: /home/cvs/ports/multimedia/xine-lib/distinfo,v retrieving revision 1.26 diff -u -p -u -p -r1.26 distinfo --- distinfo 30 Nov 2013 22:13:37 -0000 1.26 +++ distinfo 10 Apr 2014 02:03:12 -0000 @@ -1,2 +1,2 @@ -SHA256 (xine-lib-1.2.4.tar.xz) = nFsbTve9BZGWLDIqOvpwnuqluuZkZ4VI8TQOZPQ6u90= -SIZE (xine-lib-1.2.4.tar.xz) = 4954992 +SHA256 (xine-lib-1.2.5.tar.xz) = yOpAkNH6g/i2iHEYcwVHqpGIYtYPQ+pnAIn5BT5Uq3w= +SIZE (xine-lib-1.2.5.tar.xz) = 5007012 Index: patches/patch-src_combined_ffmpeg_Makefile_in =================================================================== RCS file: patches/patch-src_combined_ffmpeg_Makefile_in diff -N patches/patch-src_combined_ffmpeg_Makefile_in --- patches/patch-src_combined_ffmpeg_Makefile_in 30 Nov 2013 22:13:37 -0000 1.3 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,15 +0,0 @@ -$OpenBSD: patch-src_combined_ffmpeg_Makefile_in,v 1.3 2013/11/30 22:13:37 brad Exp $ - -Improve locating of avcodec.h by replacing the sed scripts. - ---- src/combined/ffmpeg/Makefile.in.orig Wed Nov 20 18:40:06 2013 -+++ src/combined/ffmpeg/Makefile.in Wed Nov 20 18:40:47 2013 -@@ -998,7 +998,7 @@ avcodec_video.list: AV_CODECS:=/CODEC_ID_MPEG1VIDEO/,/ - # that weird shell call just yields full path of the avcodec.h file - avcodec_audio.list avcodec_video.list: $(shell \ - echo '#include "$(srcdir)/ffmpeg_decoder.h"' | $(AV_CPP) -M - |\ -- sed -e 's/ \+/\n/g;' | sed -n -e '/avcodec\.h/p;') -+ sed -e '/avcodec\.h/! d; s%^.* \([^ ]*/avcodec\.h\) .*%\1%') - $(AM_V_GEN)echo '#include "$(srcdir)/ffmpeg_decoder.h"' | $(AV_CPP) - |\ - sed -e $(AV_CODECS)'! d; s/^[ \t]*//; s/[=,].*//; /^$$/ d' >$@ - Index: patches/patch-src_demuxers_demux_flv_c =================================================================== RCS file: patches/patch-src_demuxers_demux_flv_c diff -N patches/patch-src_demuxers_demux_flv_c --- patches/patch-src_demuxers_demux_flv_c 30 Nov 2013 22:13:37 -0000 1.4 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,39 +0,0 @@ -$OpenBSD: patch-src_demuxers_demux_flv_c,v 1.4 2013/11/30 22:13:37 brad Exp $ - -Add audio language info. - ---- src/demuxers/demux_flv.c.orig Wed Nov 20 21:13:27 2013 -+++ src/demuxers/demux_flv.c Wed Nov 20 21:13:39 2013 -@@ -1034,11 +1034,31 @@ static int demux_flv_get_stream_length (demux_plugin_t - } - - static uint32_t demux_flv_get_capabilities(demux_plugin_t *this_gen) { -- return DEMUX_CAP_NOCAP; -+ return DEMUX_CAP_AUDIOLANG; - } - - static int demux_flv_get_optional_data(demux_plugin_t *this_gen, - void *data, int data_type) { -+ demux_flv_t *this = (demux_flv_t *) this_gen; -+ -+ /* be a bit paranoid */ -+ if (this == NULL || this->stream == NULL) -+ return DEMUX_OPTIONAL_UNSUPPORTED; -+ -+ switch (data_type) { -+ case DEMUX_OPTIONAL_DATA_AUDIOLANG: { -+ char *str = data; -+ int channel = *((int *)data); -+ if (channel != 0) { -+ strcpy (str, "none"); -+ } else { -+ strcpy (str, "und"); -+ return DEMUX_OPTIONAL_SUCCESS; -+ } -+ } -+ break; -+ default: ; -+ } - return DEMUX_OPTIONAL_UNSUPPORTED; - } - Index: patches/patch-src_demuxers_demux_qt_c =================================================================== RCS file: patches/patch-src_demuxers_demux_qt_c diff -N patches/patch-src_demuxers_demux_qt_c --- patches/patch-src_demuxers_demux_qt_c 30 Nov 2013 22:13:37 -0000 1.19 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,690 +0,0 @@ -$OpenBSD: patch-src_demuxers_demux_qt_c,v 1.19 2013/11/30 22:13:37 brad Exp $ - -- Simple (E)AC3 support. -- Add multitrak audio support. -- Add audio language info. - ---- src/demuxers/demux_qt.c.orig Wed Sep 18 06:04:54 2013 -+++ src/demuxers/demux_qt.c Wed Nov 20 21:11:34 2013 -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2001-2012 the xine project -+ * Copyright (C) 2001-2013 the xine project - * - * This file is part of xine, a free video player. - * -@@ -108,6 +108,8 @@ typedef unsigned int qt_atom; - #define IN24_FOURCC ME_FOURCC('i', 'n', '2', '4') - #define NI42_FOURCC ME_FOURCC('4', '2', 'n', 'i') - #define AVC1_FOURCC ME_FOURCC('a', 'v', 'c', '1') -+#define AC_3_FOURCC ME_FOURCC('a', 'c', '-', '3') -+#define EAC3_FOURCC ME_FOURCC('e', 'c', '-', '3') - - #define UDTA_ATOM QT_ATOM('u', 'd', 't', 'a') - #define META_ATOM QT_ATOM('m', 'e', 't', 'a') -@@ -131,8 +133,9 @@ typedef unsigned int qt_atom; - #define RMVC_ATOM QT_ATOM('r', 'm', 'v', 'c') - #define QTIM_ATOM QT_ATOM('q', 't', 'i', 'm') - --/* placeholder for cutting and pasting */ -+/* placeholder for cutting and pasting - #define _ATOM QT_ATOM('', '', '', '') -+*/ - - #define ATOM_PREAMBLE_SIZE 8 - #define PALETTE_COUNT 256 -@@ -315,6 +318,11 @@ typedef struct { - unsigned int timeoffs_to_sample_count; - time_to_sample_table_t *timeoffs_to_sample_table; - -+ /* what to add to output buffer type */ -+ int audio_index; -+ -+ int lang; -+ - } qt_trak; - - typedef struct { -@@ -330,6 +338,10 @@ typedef struct { - int trak_count; - qt_trak *traks; - -+#define MAX_AUDIO_TRAKS 8 -+ int audio_trak_count; -+ int audio_traks[MAX_AUDIO_TRAKS]; -+ - /* the trak numbers that won their respective frame count competitions */ - int video_trak; - int audio_trak; -@@ -699,13 +711,12 @@ static int is_qt_file(input_plugin_t *qt_file) { - off_t moov_atom_offset = -1; - int64_t moov_atom_size = -1; - int i; -- int len; - - /* if the input is non-seekable, be much more stringent about qualifying - * a QT file: In this case, the moov must be the first atom in the file */ - if ((qt_file->get_capabilities(qt_file) & INPUT_CAP_SEEKABLE) == 0) { - unsigned char preview[MAX_PREVIEW_SIZE] = { 0, }; -- len = qt_file->get_optional_data(qt_file, preview, INPUT_OPTIONAL_DATA_PREVIEW); -+ qt_file->get_optional_data(qt_file, preview, INPUT_OPTIONAL_DATA_PREVIEW); - if (_X_BE_32(&preview[4]) == MOOV_ATOM) - return 1; - else { -@@ -798,7 +809,7 @@ static void parse_meta_atom(qt_info *info, unsigned ch - const uint8_t *const current_atom = &meta_atom[i]; - const qt_atom current_atom_code = _X_BE_32(¤t_atom[4]); - const uint32_t current_atom_size = _X_BE_32(¤t_atom[0]); -- uint32_t handler_type = 0; -+ /*uint32_t handler_type = 0;*/ - - switch (current_atom_code) { - case HDLR_ATOM: { -@@ -813,7 +824,7 @@ static void parse_meta_atom(qt_info *info, unsigned ch - return; - } - -- handler_type = _X_BE_32(¤t_atom[12]); -+ /*handler_type = _X_BE_32(¤t_atom[12]);*/ - } - break; - -@@ -1005,6 +1016,7 @@ static qt_error parse_trak_atom (qt_trak *trak, - if ( version > 1 ) continue; /* unsupported, undocumented */ - - trak->timescale = _X_BE_32(&trak_atom[i + (version == 0 ? 0x10 : 0x18) ]); -+ trak->lang = _X_BE_16 (trak_atom + i + (version == 0 ? 0x18 : 0x24)); - } - break; - -@@ -1284,6 +1296,8 @@ static qt_error parse_trak_atom (qt_trak *trak, - * further, do not do load these parameters if the audio is just - * PCM ('raw ', 'twos', 'sowt' or 'in24') */ - if ((current_stsd_atom_size > 0x24) && -+ (trak->stsd_atoms[k].audio.codec_fourcc != AC_3_FOURCC) && -+ (trak->stsd_atoms[k].audio.codec_fourcc != EAC3_FOURCC) && - (trak->stsd_atoms[k].audio.codec_fourcc != TWOS_FOURCC) && - (trak->stsd_atoms[k].audio.codec_fourcc != SOWT_FOURCC) && - (trak->stsd_atoms[k].audio.codec_fourcc != RAW_FOURCC) && -@@ -1322,6 +1336,12 @@ static qt_error parse_trak_atom (qt_trak *trak, - if (trak->stsd_atoms[k].audio.codec_fourcc == SAMR_FOURCC) - trak->stsd_atoms[k].audio.vbr = 1; - -+ if (trak->stsd_atoms[k].audio.codec_fourcc == AC_3_FOURCC) -+ trak->stsd_atoms[k].audio.vbr = 1; -+ -+ if (trak->stsd_atoms[k].audio.codec_fourcc == EAC3_FOURCC) -+ trak->stsd_atoms[k].audio.vbr = 1; -+ - if (trak->stsd_atoms[k].audio.codec_fourcc == ALAC_FOURCC) { - trak->stsd_atoms[k].audio.vbr = 1; - /* further, FFmpeg's ALAC decoder requires 36 out-of-band bytes */ -@@ -2446,10 +2466,8 @@ static int demux_qt_send_chunk(demux_plugin_t *this_ge - unsigned int frame_aligned_buf_size; - int frame_duration; - int first_buf; -- qt_trak *video_trak = NULL; -- qt_trak *audio_trak = NULL; -- int dispatch_audio; /* boolean for deciding which trak to dispatch */ -- int64_t pts_diff; -+ qt_trak *trak = NULL; -+ off_t current_pos = this->input->get_current_pos (this->input); - - /* if this is DRM-protected content, finish playback before it even - * tries to start */ -@@ -2468,117 +2486,105 @@ static int demux_qt_send_chunk(demux_plugin_t *this_ge - return this->status; - } - -- if (this->qt->video_trak != -1) { -- video_trak = &this->qt->traks[this->qt->video_trak]; -- } -- if (this->qt->audio_trak != -1) { -- audio_trak = &this->qt->traks[this->qt->audio_trak]; -- } -- -- if (!audio_trak && !video_trak) { -- /* something is really wrong if this case is reached */ -- this->status = DEMUX_FINISHED; -- return this->status; -- } -- -- /* check if it is time to seek */ -- if (this->qt->seek_flag) { -- this->qt->seek_flag = 0; -- -- /* if audio is present, send pts of current audio frame, otherwise -- * send current video frame pts */ -- if (audio_trak) -- _x_demux_control_newpts(this->stream, -- audio_trak->frames[audio_trak->current_frame].pts, -- BUF_FLAG_SEEK); -- else -- _x_demux_control_newpts(this->stream, -- video_trak->frames[video_trak->current_frame].pts, -- BUF_FLAG_SEEK); -- } -- - /* Decide the trak from which to dispatch a frame. Policy: Dispatch - * the frames in offset order as much as possible. If the pts difference - * between the current frames from the audio and video traks is too - * wide, make an exception. This exception deals with non-interleaved - * Quicktime files. */ -- if (!audio_trak) { -+ do { -+ int traks[MAX_AUDIO_TRAKS + 1]; -+ int trak_count = 0; -+ int min_trak = -1, next_trak = -1; -+ int64_t min_pts = 0, max_pts = 0; /* avoid warning */ -+ off_t next_pos = 0x7fffffffffffffffLL; -+ int i; - -- /* only video is present */ -- dispatch_audio = 0; -- if (video_trak->current_frame >= video_trak->frame_count) { -- this->status = DEMUX_FINISHED; -- return this->status; -+ /* Step 1: list yet unfinished traks. */ -+ if (this->qt->video_trak >= 0) { -+ trak = &this->qt->traks[this->qt->video_trak]; -+ if (trak->current_frame < trak->frame_count) -+ traks[trak_count++] = this->qt->video_trak; - } -+ for (i = 0; i < this->qt->audio_trak_count; i++) { -+ trak = &this->qt->traks[this->qt->audio_traks[i]]; -+ if (trak->current_frame < trak->frame_count) -+ traks[trak_count++] = this->qt->audio_traks[i]; -+ } - -- } else if (!video_trak) { -- -- /* only audio is present */ -- dispatch_audio = 1; -- if (audio_trak->current_frame >= audio_trak->frame_count) { -+ /* Step 2: handle trivial cases. */ -+ if (trak_count == 0) { - this->status = DEMUX_FINISHED; - return this->status; - } -+ if (trak_count == 1) { -+ trak = &this->qt->traks[traks[0]]; -+ break; -+ } - -- } else { -+ /* Step 3: find -+ * The minimum pts and the trak who has it. -+ * The maximum pts. -+ * The forward nearest to current position and the trak thereof. */ -+ for (i = 0; i < trak_count; i++) { -+ int64_t pts; -+ off_t pos; -+ trak = &this->qt->traks[traks[i]]; -+ pts = trak->frames[trak->current_frame].pts; -+ if (i == 0) { -+ min_pts = max_pts = pts; -+ min_trak = traks[i]; -+ } else if (pts < min_pts) { -+ min_pts = pts; -+ min_trak = traks[i]; -+ } else if (pts > max_pts) -+ max_pts = pts; -+ pos = trak->frames[trak->current_frame].offset; -+ if ((pos >= current_pos) && (pos < next_pos)) { -+ next_pos = pos; -+ next_trak = traks[i]; -+ } -+ } - -- /* both audio and video are present; start making some tough choices */ -+ /* Step 4: after seek, or if the pts scissors opened too much, send minimum pts trak next. -+ Otherwise, take next one by offset. */ -+ i = this->qt->seek_flag || (next_trak < 0) || (max_pts - min_pts > MAX_PTS_DIFF) ? -+ min_trak : next_trak; -+ trak = &this->qt->traks[i]; -+ } while (0); - -- /* check the frame count limits */ -- if ((audio_trak->current_frame >= audio_trak->frame_count) && -- (video_trak->current_frame >= video_trak->frame_count)) { -+ if (this->stream->xine->verbosity == XINE_VERBOSITY_DEBUG + 1) { -+ xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG + 1, -+ "demux_qt: sending trak %d dts %"PRId64" pos %"PRId64"\n", -+ trak - this->qt->traks, -+ trak->frames[trak->current_frame].pts, -+ trak->frames[trak->current_frame].offset); -+ } - -- this->status = DEMUX_FINISHED; -- return this->status; -+ /* check if it is time to seek */ -+ if (this->qt->seek_flag) { -+ this->qt->seek_flag = 0; - -- } else if (video_trak->current_frame >= video_trak->frame_count) { -- -- dispatch_audio = 1; -- -- } else if (audio_trak->current_frame >= audio_trak->frame_count) { -- -- dispatch_audio = 0; -- -- } else { -- -- /* at this point, it is certain that both traks still have frames -- * yet to be dispatched */ -- pts_diff = audio_trak->frames[audio_trak->current_frame].pts; -- pts_diff -= video_trak->frames[video_trak->current_frame].pts; -- -- if (pts_diff > MAX_PTS_DIFF) { -- /* if diff is +max_diff, audio is too far ahead of video */ -- dispatch_audio = 0; -- } else if (pts_diff < -MAX_PTS_DIFF) { -- /* if diff is -max_diff, video is too far ahead of audio */ -- dispatch_audio = 1; -- } else if (audio_trak->frames[audio_trak->current_frame].offset < -- video_trak->frames[video_trak->current_frame].offset) { -- /* pts diff is not too wide, decide based on earlier offset */ -- dispatch_audio = 1; -- } else { -- dispatch_audio = 0; -- } -- } -+ /* send min pts of all used traks, usually audio (see demux_qt_seek ()). */ -+ _x_demux_control_newpts (this->stream, trak->frames[trak->current_frame].pts, BUF_FLAG_SEEK); - } - -- if (!dispatch_audio) { -- i = video_trak->current_frame++; -+ if (trak->type == MEDIA_VIDEO) { -+ i = trak->current_frame++; - -- if (video_trak->frames[i].media_id != video_trak->properties->video.media_id) { -+ if (trak->frames[i].media_id != trak->properties->video.media_id) { - this->status = DEMUX_OK; - return this->status; - } - -- remaining_sample_bytes = video_trak->frames[i].size; -- this->input->seek(this->input, video_trak->frames[i].offset, -- SEEK_SET); -+ remaining_sample_bytes = trak->frames[i].size; -+ if (trak->frames[i].offset != current_pos) -+ this->input->seek (this->input, trak->frames[i].offset, SEEK_SET); - -- if (i + 1 < video_trak->frame_count) { -+ if (i + 1 < trak->frame_count) { - /* frame duration is the pts diff between this video frame and - * the next video frame */ -- frame_duration = video_trak->frames[i + 1].pts; -- frame_duration -= video_trak->frames[i].pts; -+ frame_duration = trak->frames[i + 1].pts; -+ frame_duration -= trak->frames[i].pts; - } else { - /* give the last frame some fixed duration */ - frame_duration = 12000; -@@ -2590,10 +2596,10 @@ static int demux_qt_send_chunk(demux_plugin_t *this_ge - * to compensate. */ - if (!frame_duration) { - frame_duration = 1; -- video_trak->properties->video.edit_list_compensation++; -+ trak->properties->video.edit_list_compensation++; - } else { -- frame_duration -= video_trak->properties->video.edit_list_compensation; -- video_trak->properties->video.edit_list_compensation = 0; -+ frame_duration -= trak->properties->video.edit_list_compensation; -+ trak->properties->video.edit_list_compensation = 0; - } - - _x_stream_info_set(this->stream, XINE_STREAM_INFO_FRAME_DURATION, -@@ -2601,19 +2607,19 @@ static int demux_qt_send_chunk(demux_plugin_t *this_ge - - debug_video_demux(" qt: sending off video frame %d from offset 0x%"PRIX64", %d bytes, media id %d, %"PRId64" pts\n", - i, -- video_trak->frames[i].offset, -- video_trak->frames[i].size, -- video_trak->frames[i].media_id, -- video_trak->frames[i].pts); -+ trak->frames[i].offset, -+ trak->frames[i].size, -+ trak->frames[i].media_id, -+ trak->frames[i].pts); - - while (remaining_sample_bytes) { - buf = this->video_fifo->buffer_pool_alloc (this->video_fifo); -- buf->type = video_trak->properties->video.codec_buftype; -+ buf->type = trak->properties->video.codec_buftype; - if( this->data_size ) -- buf->extra_info->input_normpos = (int)( (double) (video_trak->frames[i].offset - this->data_start) -+ buf->extra_info->input_normpos = (int)( (double) (trak->frames[i].offset - this->data_start) - * 65535 / this->data_size); -- buf->extra_info->input_time = video_trak->frames[i].pts / 90; -- buf->pts = video_trak->frames[i].pts + (int64_t)video_trak->frames[i].ptsoffs; -+ buf->extra_info->input_time = trak->frames[i].pts / 90; -+ buf->pts = trak->frames[i].pts + (int64_t)trak->frames[i].ptsoffs; - - buf->decoder_flags |= BUF_FLAG_FRAMERATE; - buf->decoder_info[0] = frame_duration; -@@ -2631,7 +2637,7 @@ static int demux_qt_send_chunk(demux_plugin_t *this_ge - break; - } - -- if (video_trak->frames[i].keyframe) -+ if (trak->frames[i].keyframe) - buf->decoder_flags |= BUF_FLAG_KEYFRAME; - if (!remaining_sample_bytes) - buf->decoder_flags |= BUF_FLAG_FRAME_END; -@@ -2639,11 +2645,11 @@ static int demux_qt_send_chunk(demux_plugin_t *this_ge - this->video_fifo->put(this->video_fifo, buf); - } - -- } else { -+ } else { /* trak->type == MEDIA_AUDIO */ - /* load an audio sample and packetize it */ -- i = audio_trak->current_frame++; -+ i = trak->current_frame++; - -- if (audio_trak->frames[i].media_id != audio_trak->properties->audio.media_id) { -+ if (trak->frames[i].media_id != trak->properties->audio.media_id) { - this->status = DEMUX_OK; - return this->status; - } -@@ -2652,24 +2658,24 @@ static int demux_qt_send_chunk(demux_plugin_t *this_ge - if (!this->audio_fifo) - return this->status; - -- remaining_sample_bytes = audio_trak->frames[i].size; -+ remaining_sample_bytes = trak->frames[i].size; - -- this->input->seek(this->input, audio_trak->frames[i].offset, -- SEEK_SET); -+ if (trak->frames[i].offset != current_pos) -+ this->input->seek (this->input, trak->frames[i].offset, SEEK_SET); - - debug_audio_demux(" qt: sending off audio frame %d from offset 0x%"PRIX64", %d bytes, media id %d, %"PRId64" pts\n", - i, -- audio_trak->frames[i].offset, -- audio_trak->frames[i].size, -- audio_trak->frames[i].media_id, -- audio_trak->frames[i].pts); -+ trak->frames[i].offset, -+ trak->frames[i].size, -+ trak->frames[i].media_id, -+ trak->frames[i].pts); - - first_buf = 1; - while (remaining_sample_bytes) { - buf = this->audio_fifo->buffer_pool_alloc (this->audio_fifo); -- buf->type = audio_trak->properties->audio.codec_buftype; -+ buf->type = trak->properties->audio.codec_buftype; - if( this->data_size ) -- buf->extra_info->input_normpos = (int)( (double) (audio_trak->frames[i].offset - this->data_start) -+ buf->extra_info->input_normpos = (int)( (double) (trak->frames[i].offset - this->data_start) - * 65535 / this->data_size); - /* The audio chunk is often broken up into multiple 8K buffers when - * it is sent to the audio decoder. Only attach the proper timestamp -@@ -2680,20 +2686,20 @@ static int demux_qt_send_chunk(demux_plugin_t *this_ge - if ((buf->type == BUF_AUDIO_LPCM_BE) || - (buf->type == BUF_AUDIO_LPCM_LE)) { - if (first_buf) { -- buf->extra_info->input_time = audio_trak->frames[i].pts / 90; -- buf->pts = audio_trak->frames[i].pts; -+ buf->extra_info->input_time = trak->frames[i].pts / 90; -+ buf->pts = trak->frames[i].pts; - first_buf = 0; - } else { - buf->extra_info->input_time = 0; - buf->pts = 0; - } - } else { -- buf->extra_info->input_time = audio_trak->frames[i].pts / 90; -- buf->pts = audio_trak->frames[i].pts; -+ buf->extra_info->input_time = trak->frames[i].pts / 90; -+ buf->pts = trak->frames[i].pts; - } - - /* 24-bit audio doesn't fit evenly into the default 8192-byte buffers */ -- if (audio_trak->properties->audio.bits == 24) -+ if (trak->properties->audio.bits == 24) - frame_aligned_buf_size = 8184; - else - frame_aligned_buf_size = buf->max_size; -@@ -2713,9 +2719,9 @@ static int demux_qt_send_chunk(demux_plugin_t *this_ge - - /* Special case alert: If this is signed, 8-bit data, transform - * the data to unsigned. */ -- if ((audio_trak->properties->audio.bits == 8) && -- ((audio_trak->properties->audio.codec_fourcc == TWOS_FOURCC) || -- (audio_trak->properties->audio.codec_fourcc == SOWT_FOURCC))) -+ if ((trak->properties->audio.bits == 8) && -+ ((trak->properties->audio.codec_fourcc == TWOS_FOURCC) || -+ (trak->properties->audio.codec_fourcc == SOWT_FOURCC))) - for (j = 0; j < buf->size; j++) - buf->content[j] += 0x80; - -@@ -2723,6 +2729,7 @@ static int demux_qt_send_chunk(demux_plugin_t *this_ge - buf->decoder_flags |= BUF_FLAG_FRAME_END; - } - -+ buf->type |= trak->audio_index; - this->audio_fifo->put(this->audio_fifo, buf); - } - } -@@ -2738,6 +2745,9 @@ static void demux_qt_send_headers(demux_plugin_t *this - qt_trak *audio_trak = NULL; - unsigned int audio_bitrate; - -+ int tnum; -+ int audio_index = 0; -+ - /* for deciding data start and data size */ - int64_t first_video_offset = -1; - int64_t last_video_offset = -1; -@@ -2820,31 +2830,6 @@ static void demux_qt_send_headers(demux_plugin_t *this - - if (this->qt->audio_trak != -1) { - -- /* in mp4 files the audio fourcc is always 'mp4a' - the codec is -- * specified by the object type id field in the esds atom */ -- if(audio_trak->properties->audio.codec_fourcc == MP4A_FOURCC) { -- switch(audio_trak->object_type_id) { -- case 107: -- audio_trak->properties->audio.codec_buftype = BUF_AUDIO_MPEG; -- break; -- default: -- /* default to AAC if we have no better idea */ -- audio_trak->properties->audio.codec_buftype = BUF_AUDIO_AAC; -- break; -- } -- } else { -- audio_trak->properties->audio.codec_buftype = -- _x_formattag_to_buf_audio(audio_trak->properties->audio.codec_fourcc); -- } -- -- if( !audio_trak->properties->audio.codec_buftype && -- audio_trak->properties->audio.codec_fourcc ) -- { -- audio_trak->properties->audio.codec_buftype = BUF_AUDIO_UNKNOWN; -- _x_report_audio_format_tag (this->stream->xine, LOG_MODULE, -- audio_trak->properties->audio.codec_fourcc); -- } -- - _x_stream_info_set(this->stream, XINE_STREAM_INFO_HAS_AUDIO, 1); - _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_CHANNELS, - audio_trak->properties->audio.channels); -@@ -2941,10 +2926,44 @@ static void demux_qt_send_headers(demux_plugin_t *this - this->video_fifo->put (this->video_fifo, buf); - } - -- if ((this->qt->audio_trak != -1) && -- (audio_trak->properties->audio.codec_buftype) && -- this->audio_fifo) { -+ for (tnum = 0; tnum < this->qt->trak_count; tnum++) { - -+ audio_trak = &this->qt->traks[tnum]; -+ if (audio_trak->type != MEDIA_AUDIO) -+ continue; -+ -+ /* in mp4 files the audio fourcc is always 'mp4a' - the codec is -+ * specified by the object type id field in the esds atom */ -+ if (audio_trak->properties->audio.codec_fourcc == MP4A_FOURCC) { -+ switch (audio_trak->object_type_id) { -+ case 107: -+ audio_trak->properties->audio.codec_buftype = BUF_AUDIO_MPEG; -+ break; -+ default: -+ /* default to AAC if we have no better idea */ -+ audio_trak->properties->audio.codec_buftype = BUF_AUDIO_AAC; -+ break; -+ } -+ } else { -+ audio_trak->properties->audio.codec_buftype = -+ _x_formattag_to_buf_audio (audio_trak->properties->audio.codec_fourcc); -+ } -+ -+ if (!audio_trak->properties->audio.codec_buftype && -+ audio_trak->properties->audio.codec_fourcc) { -+ audio_trak->properties->audio.codec_buftype = BUF_AUDIO_UNKNOWN; -+ _x_report_audio_format_tag (this->stream->xine, LOG_MODULE, -+ audio_trak->properties->audio.codec_fourcc); -+ } -+ -+ if ((audio_trak->properties->audio.codec_buftype == 0) || -+ (audio_index >= MAX_AUDIO_TRAKS) || -+ (this->audio_fifo == NULL)) -+ continue; -+ -+ this->qt->audio_traks[audio_index] = tnum; -+ audio_trak->audio_index = audio_index; -+ - /* set the audio bitrate field (only for CBR audio) */ - if (!audio_trak->properties->audio.vbr) { - audio_bitrate = -@@ -2958,7 +2977,7 @@ static void demux_qt_send_headers(demux_plugin_t *this - } - - buf = this->audio_fifo->buffer_pool_alloc (this->audio_fifo); -- buf->type = audio_trak->properties->audio.codec_buftype; -+ buf->type = audio_trak->properties->audio.codec_buftype | audio_index; - buf->decoder_flags = BUF_FLAG_HEADER|BUF_FLAG_STDHEADER|BUF_FLAG_FRAME_END; - buf->decoder_info[0] = 0; - buf->decoder_info[1] = audio_trak->properties->audio.sample_rate; -@@ -2980,7 +2999,7 @@ static void demux_qt_send_headers(demux_plugin_t *this - - if( audio_trak->decoder_config ) { - buf = this->audio_fifo->buffer_pool_alloc (this->audio_fifo); -- buf->type = audio_trak->properties->audio.codec_buftype; -+ buf->type = audio_trak->properties->audio.codec_buftype | audio_index; - buf->size = 0; - buf->decoder_flags = BUF_FLAG_SPECIAL|BUF_FLAG_HEADER; - buf->decoder_info[1] = BUF_SPECIAL_DECODER_CONFIG; -@@ -2996,9 +3015,10 @@ static void demux_qt_send_headers(demux_plugin_t *this - buf->decoder_info[2] = audio_trak->properties->audio.properties_atom_size; - buf->decoder_info_ptr[2] = audio_trak->properties->audio.properties_atom; - buf->size = 0; -- buf->type = audio_trak->properties->audio.codec_buftype; -+ buf->type = audio_trak->properties->audio.codec_buftype | audio_index; - this->audio_fifo->put (this->audio_fifo, buf); - -+ this->qt->audio_trak_count = ++audio_index; - } - } - -@@ -3069,7 +3089,8 @@ static int demux_qt_seek (demux_plugin_t *this_gen, - demux_qt_t *this = (demux_qt_t *) this_gen; - qt_trak *video_trak = NULL; - qt_trak *audio_trak = NULL; -- int64_t keyframe_pts; -+ int i; -+ int64_t keyframe_pts = -1; - - start_pos = (off_t) ( (double) start_pos / 65535 * - this->data_size ); -@@ -3089,32 +3110,32 @@ static int demux_qt_seek (demux_plugin_t *this_gen, - this->status = binary_seek(video_trak, start_pos, start_time); - if (this->status != DEMUX_OK) - return this->status; -- } -- -- if (this->qt->audio_trak != -1) { -- audio_trak = &this->qt->traks[this->qt->audio_trak]; -- this->status = binary_seek(audio_trak, start_pos, start_time); -- if (this->status != DEMUX_OK) -- return this->status; -- } -- -- /* search back in the video trak for the nearest keyframe */ -- if (video_trak) -+ /* search back in the video trak for the nearest keyframe */ - while (video_trak->current_frame) { - if (video_trak->frames[video_trak->current_frame].keyframe) { - break; - } - video_trak->current_frame--; - } -+ keyframe_pts = video_trak->frames[video_trak->current_frame].pts; -+ } - -+ /* seek all supported audio traks */ -+ for (i = 0; i < this->qt->audio_trak_count; i++) { -+ audio_trak = &this->qt->traks[this->qt->audio_traks[i]]; -+ this->status = binary_seek(audio_trak, start_pos, start_time); -+ if (this->status != DEMUX_OK) -+ return this->status; -+ } -+ - /* not done yet; now that the nearest keyframe has been found, seek - * back to the first audio frame that has a pts less than or equal to - * that of the keyframe; do not go through with this process there is - * no video trak */ -- if (audio_trak && video_trak) { -- keyframe_pts = video_trak->frames[video_trak->current_frame].pts; -+ if (keyframe_pts >= 0) for (i = 0; i < this->qt->audio_trak_count; i++) { -+ audio_trak = &this->qt->traks[this->qt->audio_traks[i]]; - while (audio_trak->current_frame) { -- if (audio_trak->frames[audio_trak->current_frame].pts < keyframe_pts) { -+ if (audio_trak->frames[audio_trak->current_frame].pts <= keyframe_pts) { - break; - } - audio_trak->current_frame--; -@@ -3158,11 +3179,39 @@ static int demux_qt_get_stream_length (demux_plugin_t - } - - static uint32_t demux_qt_get_capabilities(demux_plugin_t *this_gen) { -- return DEMUX_CAP_NOCAP; -+ return DEMUX_CAP_AUDIOLANG; - } - - static int demux_qt_get_optional_data(demux_plugin_t *this_gen, - void *data, int data_type) { -+ demux_qt_t *this = (demux_qt_t *) this_gen; -+ -+ /* be a bit paranoid */ -+ if (this == NULL || this->stream == NULL) -+ return DEMUX_OPTIONAL_UNSUPPORTED; -+ -+ switch (data_type) { -+ case DEMUX_OPTIONAL_DATA_AUDIOLANG: { -+ char *str = data; -+ int channel = *((int *)data); -+ if ((channel < 0) || (channel >= this->qt->audio_trak_count)) { -+ strcpy (str, "none"); -+ } else { -+ int lang = this->qt->traks[this->qt->audio_traks[channel]].lang; -+ if ((lang < 0x400) || (lang == 0x7fff)) { -+ sprintf (str, "%d", channel); -+ } else { -+ int i; -+ for (i = 10; i >= 0; i -= 5) -+ *str++ = 0x60 | ((lang >> i) & 0x1f); -+ *str = 0; -+ } -+ return DEMUX_OPTIONAL_SUCCESS; -+ } -+ } -+ break; -+ default: ; -+ } - return DEMUX_OPTIONAL_UNSUPPORTED; - } - Index: patches/patch-src_demuxers_demux_real_c =================================================================== RCS file: patches/patch-src_demuxers_demux_real_c diff -N patches/patch-src_demuxers_demux_real_c --- patches/patch-src_demuxers_demux_real_c 30 Nov 2013 22:13:37 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,273 +0,0 @@ -$OpenBSD: patch-src_demuxers_demux_real_c,v 1.1 2013/11/30 22:13:37 brad Exp $ - -- Fix realvideo reordered pts. -- Better a/v sync. - ---- src/demuxers/demux_real.c.orig Wed Nov 20 19:25:44 2013 -+++ src/demuxers/demux_real.c Wed Nov 20 21:08:18 2013 -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2000-2012 the xine project -+ * Copyright (C) 2000-2013 the xine project - * - * This file is part of xine, a free video player. - * -@@ -122,6 +122,7 @@ typedef struct { - uint8_t *frame_buffer; - uint32_t frame_num_bytes; - uint32_t sub_packet_cnt; -+ uint32_t audio_time; - } real_stream_t; - - typedef struct { -@@ -158,13 +159,7 @@ typedef struct { - - int64_t last_pts[2]; - int send_newpts; -- int buf_flag_seek; - -- uint32_t last_ts; -- uint32_t next_ts; -- int last_seq; -- int next_seq; -- - int fragment_size; /* video sub-demux */ - int fragment_count; - uint32_t *fragment_tab; -@@ -976,96 +971,72 @@ static int demux_real_parse_references( demux_real_t * - #define WRAP_THRESHOLD 220000 - #define PTS_AUDIO 0 - #define PTS_VIDEO 1 -+#define PTS_BOTH 2 - - static void check_newpts (demux_real_t *this, int64_t pts, int video, int preview) { - const int64_t diff = pts - this->last_pts[video]; -- lprintf ("check_newpts %"PRId64"\n", pts); - -- if (!preview && pts && -- (this->send_newpts || (this->last_pts[video] && abs(diff)>WRAP_THRESHOLD) ) ) { -+ if (preview) -+ return; - -- lprintf ("diff=%"PRId64"\n", diff); -- -- if (this->buf_flag_seek) { -- _x_demux_control_newpts(this->stream, pts, BUF_FLAG_SEEK); -- this->buf_flag_seek = 0; -- } else { -- _x_demux_control_newpts(this->stream, pts, 0); -- } -- this->send_newpts = 0; -- this->last_pts[1-video] = 0; -+ /* Metronom does not strictly follow audio pts. They usually are too coarse -+ for seamless playback. Instead, it takes the latest discontinuity as a -+ starting point. This can lead to terrible lags for our very long audio frames. -+ So let's make sure audio has the last word here. */ -+ if (this->send_newpts > video) { -+ _x_demux_control_newpts (this->stream, pts, BUF_FLAG_SEEK); -+ this->send_newpts = video; -+ this->last_pts[video] = pts; -+ this->last_pts[1 - video] = 0; -+ } else if (pts && (this->last_pts[video]) && (abs (diff) > WRAP_THRESHOLD)) { -+ _x_demux_control_newpts (this->stream, pts, 0); -+ this->send_newpts = 0; -+ this->last_pts[1 - video] = 0; - } - -- if (!preview && pts ) -+ if (pts) - this->last_pts[video] = pts; - } - --static uint32_t real_fix_timestamp (demux_real_t *this, uint8_t *hdr, uint32_t ts_in) { -- int pict_type; -- int seq; -- uint32_t ts_out; -- -- switch(this->video_stream->buf_type) { -+static uint32_t real_get_reordered_pts (demux_real_t *this, uint8_t *hdr, uint32_t dts) { -+ int pict_type; /* I1/I2/P/B-frame */ -+ uint32_t t, pts; -+ /* lower 13 bits of pts are stored within the frame */ -+ pict_type = hdr[0]; -+ t = ((((uint32_t)hdr[1] << 8) | hdr[2]) << 8) | hdr[3]; -+ switch (this->video_stream->buf_type) { - case BUF_VIDEO_RV20: -- pict_type = (hdr[0] & 0xC0) >> 6; -- seq = ((hdr[1] & 0x7F) << 6) + ((hdr[2] & 0xFC) >> 2); -- break; -+ pict_type >>= 6; -+ t >>= 10; -+ break; - case BUF_VIDEO_RV30: -- pict_type = (hdr[0] & 0x18) >> 3; -- seq = ((hdr[1] & 0x0F) << 9) + (hdr[2] << 1) + ((hdr[3] & 0x80) >> 7); -- break; -+ pict_type >>= 3; -+ t >>= 7; -+ break; - case BUF_VIDEO_RV40: -- pict_type = (hdr[0] & 0x60) >> 5; -- seq = ((hdr[1] & 0x07) << 10) + (hdr[2] << 2) + ((hdr[3] & 0xC0) >> 6); -- break; -+ pict_type >>= 5; -+ t >>= 6; -+ break; - default: - xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG, - "demux_real: can't fix timestamp for buf type 0x%08x\n", - this->video_stream->buf_type); -- return ts_in; -- break; -+ return (dts); -+ break; - } - -- switch (pict_type) { -- case 0: -- case 1: -- /* I frame */ -- ts_out = this->next_ts; -- -- this->last_ts = this->next_ts; -- this->next_ts = ts_in; -- -- this->last_seq = this->next_seq; -- this->next_seq = seq; -- break; -- case 2: -- /* P frame */ -- ts_out = this->next_ts; -- -- this->last_ts = this->next_ts; -- if (seq < this->next_seq) -- this->next_ts += seq + 8192 - this->next_seq; -- else -- this->next_ts += seq - this->next_seq; -- -- this->last_seq = this->next_seq; -- this->next_seq = seq; -- break; -- case 3: -- /* B frame */ -- if (seq < this->last_seq) -- ts_out = ((seq + 8192 - this->last_seq) + this->last_ts); -- else -- ts_out = ((seq - this->last_seq) + this->last_ts); -- break; -- default: -- xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG, -- "demux_real: unknown pict_type: %d\n", pict_type); -- ts_out = 0; -- break; -+ pict_type &= 3; -+ t &= 0x1fff; -+ pts = (dts & (~0x1fff)) | t; -+ /* snap to dts +/- 4.095 seconds */ -+ if (dts + 0x1000 < pts) pts -= 0x2000; -+ else if (dts > pts + 0x1000) pts += 0x2000; -+ if (this->stream->xine->verbosity == XINE_VERBOSITY_DEBUG + 1) { -+ xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG + 1, -+ "demux_real: video pts: %d.%03d:%04d -> %d.%03d (%d)\n", -+ dts / 1000, dts % 1000, t, pts / 1000, pts % 1000, pict_type); - } -- -- return ts_out; -+ return (pts); - } - - static int stream_read_char (demux_real_t *this) { -@@ -1121,7 +1092,7 @@ static int demux_real_send_chunk(demux_plugin_t *this_ - const uint16_t stream = _X_BE_16(&header[4]); - const off_t offset __attr_unused = this->input->get_current_pos(this->input); - uint16_t size = _X_BE_16(&header[2]) - DATA_PACKET_HEADER_SIZE; -- const uint32_t timestamp= _X_BE_32(&header[6]); -+ uint32_t timestamp= _X_BE_32(&header[6]); - int64_t pts = (int64_t) timestamp * 90; - - /* Data packet header with version 1 contains 1 extra byte */ -@@ -1330,14 +1301,14 @@ static int demux_real_send_chunk(demux_plugin_t *this_ - /* if the video stream has b-frames fix the timestamps */ - if((this->video_stream->format >= 0x20200002) && - (buf->decoder_flags & BUF_FLAG_FRAME_START)) -- pts = (int64_t) real_fix_timestamp(this, buf->content, timestamp) * 90; -+ pts = (int64_t)real_get_reordered_pts (this, buf->content, timestamp) * 90; - - /* this test was moved from ffmpeg video decoder. - * fixme: is pts only valid on frame start? */ -- if( buf->decoder_flags & BUF_FLAG_FRAME_START ) -+ if (buf->decoder_flags & BUF_FLAG_FRAME_START) { - buf->pts = pts; -- else -- buf->pts = 0; -+ check_newpts (this, pts, PTS_VIDEO, 0); -+ } else buf->pts = 0; - pts = 0; - - buf->extra_info->input_normpos = normpos; -@@ -1371,6 +1342,35 @@ static int demux_real_send_chunk(demux_plugin_t *this_ - else - this->audio_need_keyframe = 0; - -+ /* speed up when not debugging */ -+ if (this->stream->xine->verbosity == XINE_VERBOSITY_DEBUG + 1) { -+ xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG + 1, -+ "demux_real: audio pts: %d.%03d %s%s\n", -+ timestamp / 1000, timestamp % 1000, -+ keyframe ? "*" : " ", -+ this->audio_stream->sub_packet_cnt ? " " : "s"); -+ } -+ -+ /* cook audio frames are fairly long (almost 2 seconds). For obfuscation -+ purposes, they are sent as multiple fragments in intentionally wrong order. -+ The first sent fragment has the timestamp for the whole frame. -+ -+ Sometimes, the remaining fragments all carry the same time, and appear -+ immediately thereafter. This is easy. -+ -+ Sometimes, the remaining fragments carry fake timestamps interpolated across -+ the frame duration. Consequently, they will be muxed between the next few -+ video frames. We get the complete frame ~2 seconds late. This is ugly. -+ Let's be careful not to trap metronom into a big lag. */ -+ if (!this->audio_stream->sub_packet_cnt) -+ this->audio_stream->audio_time = timestamp; -+ else -+ timestamp = this->audio_stream->audio_time; -+ /* nasty kludge, maybe this is somewhere in mdpr? */ -+ if (this->audio_stream->buf_type == BUF_AUDIO_COOK) -+ timestamp += 120; -+ pts = (int64_t) timestamp * 90; -+ - /* if we have a seekable stream then use the timestamp for the data - * packet for more accurate seeking - if not then estimate time using - * average bitrate */ -@@ -1549,6 +1549,7 @@ static void demux_real_send_headers(demux_plugin_t *th - - this->last_pts[0] = 0; - this->last_pts[1] = 0; -+ this->send_newpts = PTS_BOTH; - - this->avg_bitrate = 1; - -@@ -1624,7 +1625,6 @@ static int demux_real_seek (demux_plugin_t *this_gen, - if(this->audio_stream) - this->audio_stream->sub_packet_cnt = 0; - -- this->buf_flag_seek = 1; - _x_demux_flush_engine(this->stream); - } - } -@@ -1636,12 +1636,9 @@ static int demux_real_seek (demux_plugin_t *this_gen, - this->input->seek_time(this->input, start_time, SEEK_SET); - } - -- this->send_newpts = 1; -+ this->send_newpts = PTS_BOTH; - this->old_seqnum = -1; - this->fragment_size = 0; -- -- this->next_ts = 0; -- this->next_seq = 0; - - this->status = DEMUX_OK; - Index: patches/patch-src_libreal_xine_real_video_decoder_c =================================================================== RCS file: patches/patch-src_libreal_xine_real_video_decoder_c diff -N patches/patch-src_libreal_xine_real_video_decoder_c --- patches/patch-src_libreal_xine_real_video_decoder_c 30 Nov 2013 22:13:37 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,22 +0,0 @@ -$OpenBSD: patch-src_libreal_xine_real_video_decoder_c,v 1.1 2013/11/30 22:13:37 brad Exp $ - -Fix realvideo reordered pts. - ---- src/libreal/xine_real_video_decoder.c.orig Wed Nov 20 21:08:49 2013 -+++ src/libreal/xine_real_video_decoder.c Wed Nov 20 21:09:13 2013 -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2000-2011 the xine project -+ * Copyright (C) 2000-2013 the xine project - * - * This file is part of xine, a free video player. - * -@@ -420,7 +420,7 @@ static void realdec_decode_data (video_decoder_t *this - XINE_IMGFMT_YV12, - VO_BOTH_FIELDS); - -- img->pts = this->pts; -+ img->pts = (int64_t)transform_out.timestamp * 90; - img->duration = this->duration; - _x_stream_info_set(this->stream, XINE_STREAM_INFO_FRAME_DURATION, this->duration); - img->bad_frame = 0; Index: patches/patch-src_post_deinterlace_plugins_Makefile_in =================================================================== RCS file: /home/cvs/ports/multimedia/xine-lib/patches/patch-src_post_deinterlace_plugins_Makefile_in,v retrieving revision 1.14 diff -u -p -u -p -r1.14 patch-src_post_deinterlace_plugins_Makefile_in --- patches/patch-src_post_deinterlace_plugins_Makefile_in 30 Nov 2013 22:13:37 -0000 1.14 +++ patches/patch-src_post_deinterlace_plugins_Makefile_in 10 Apr 2014 02:07:22 -0000 @@ -1,7 +1,7 @@ $OpenBSD: patch-src_post_deinterlace_plugins_Makefile_in,v 1.14 2013/11/30 22:13:37 brad Exp $ ---- src/post/deinterlace/plugins/Makefile.in.orig Mon Sep 23 16:58:17 2013 -+++ src/post/deinterlace/plugins/Makefile.in Wed Nov 20 16:57:34 2013 -@@ -592,7 +592,7 @@ noinst_HEADERS = plugins.h greedyhmacros.h +--- src/post/deinterlace/plugins/Makefile.in.orig Tue Apr 8 11:04:17 2014 ++++ src/post/deinterlace/plugins/Makefile.in Wed Apr 9 22:07:16 2014 +@@ -597,7 +597,7 @@ noinst_HEADERS = plugins.h greedyhmacros.h # doesn't run out of general registers trying to compile it. noinst_LTLIBRARIES = libdeinterlacepluginsO1.la libdeinterlaceplugins.la libdeinterlacepluginsO1_la_SOURCES = kdetv_greedyh.c $(debug_sources) Index: patches/patch-src_xine-engine_buffer_types_c =================================================================== RCS file: patches/patch-src_xine-engine_buffer_types_c diff -N patches/patch-src_xine-engine_buffer_types_c --- patches/patch-src_xine-engine_buffer_types_c 30 Nov 2013 22:13:37 -0000 1.3 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,14 +0,0 @@ -$OpenBSD: patch-src_xine-engine_buffer_types_c,v 1.3 2013/11/30 22:13:37 brad Exp $ - -Simple (E)AC3 support. - ---- src/xine-engine/buffer_types.c.orig Wed Nov 20 17:06:37 2013 -+++ src/xine-engine/buffer_types.c Wed Nov 20 17:07:19 2013 -@@ -808,6 +808,7 @@ static const audio_db_t audio_db[] = { - { - 0x2000, - ME_FOURCC('m', 's', 0x20, 0x00), -+ ME_FOURCC('a', 'c', '-', '3'), - 0 - }, - BUF_AUDIO_A52, -- This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean.