From e1d8609143bc661b9ad84c91abb815ca0e9f9e36 Mon Sep 17 00:00:00 2001 From: Johns Date: Thu, 8 Dec 2011 20:50:32 +0100 Subject: [PATCH] Pass audio PTS to codec. Correct PTS extraction and pass it to codec module. C++ destructor calls C function. Fix spuDecoder is used uninitialized. --- Todo | 12 +++++++++++- softhddev.c | 51 +++++++++++++++++++++++++++++++----------------- softhddev.h | 2 ++ softhddevice.cpp | 6 +++++- 4 files changed, 51 insertions(+), 20 deletions(-) diff --git a/Todo b/Todo index 0697eac..9671086 100644 --- a/Todo +++ b/Todo @@ -1,8 +1,18 @@ + libva-intel-driver: - unscaled osd not working + intel still has hangups + osd has sometimes wrong size (workaround written) + can show defect surfaces (white bars on top of frame) only interlace + defect shown upto driver surface swap? + libva-vdpau-driver: G210 osd update too slow (needs hardware problem workaround) +x11: + support resize of x11 window + support fullscreen window + support fullscreen / window toggle + video/audio asyncron playback of >2 channels on 2 channel hardware diff --git a/softhddev.c b/softhddev.c index 081a27a..067b8f5 100644 --- a/softhddev.c +++ b/softhddev.c @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -78,30 +79,32 @@ void PlayAudio(const uint8_t * data, int size, uint8_t id) // MPEG-PS mp2 MPEG1, MPEG2, AC3 if (size < 9) { - Error("[softhddev] invalid audio packet\n"); + Error(_("[softhddev] invalid audio packet\n")); return; } - avpkt->pts = AV_NOPTS_VALUE; - avpkt->dts = AV_NOPTS_VALUE; - if (data[7] & 0x80) { + n = data[8]; // header size + + av_init_packet(avpkt); + if (data[7] & 0x80 && n >= 5) { avpkt->pts = (int64_t) (data[9] & 0x0E) << 29 | data[10] << 22 | (data[11] & - 0xFE) << 15 | data[12] << 7 | (data[13] & 0xFE) >> 1; - // Debug(3, "audio: pts %ld\n", avpkt->pts); + 0xFE) << 14 | data[12] << 7 | (data[13] & 0xFE) >> 1; + // Debug(3, "audio: pts %#012" PRIx64 "\n", avpkt->pts); } - if (data[7] & 0x40) { - avpkt->dts = - (int64_t) (data[14] & 0x0E) << 29 | data[15] << 22 | (data[16] & - 0xFE) << 15 | data[17] << 7 | (data[18] & 0xFE) >> 1; - Debug(3, "audio: dts %ld\n", avpkt->dts); + if (0) { // dts is unused + if (data[7] & 0x40) { + avpkt->dts = + (int64_t) (data[14] & 0x0E) << 29 | data[15] << 22 | (data[16] + & 0xFE) << 14 | data[17] << 7 | (data[18] & 0xFE) >> 1; + Debug(3, "audio: dts %#012" PRIx64 "\n", avpkt->dts); + } } - n = data[8]; // header size data += 9 + n; size -= 9 + n; // skip pes header if (size <= 0) { - Error("[softhddev] invalid audio packet\n"); + Error(_("[softhddev] invalid audio packet\n")); return; } // Syncword - 0x0B77 @@ -113,6 +116,7 @@ void PlayAudio(const uint8_t * data, int size, uint8_t id) if (AudioCodecID != CODEC_ID_AC3) { Debug(3, "[softhddev]%s: AC-3 %d\n", __FUNCTION__, id); CodecAudioClose(MyAudioDecoder); + CodecAudioOpen(MyAudioDecoder, NULL, CODEC_ID_AC3); AudioCodecID = CODEC_ID_AC3; } @@ -125,6 +129,7 @@ void PlayAudio(const uint8_t * data, int size, uint8_t id) if (AudioCodecID != CODEC_ID_MP2) { Debug(3, "[softhddev]%s: MP2 %d\n", __FUNCTION__, id); CodecAudioClose(MyAudioDecoder); + CodecAudioOpen(MyAudioDecoder, NULL, CODEC_ID_MP2); AudioCodecID = CODEC_ID_MP2; } @@ -143,7 +148,6 @@ void PlayAudio(const uint8_t * data, int size, uint8_t id) return; } - av_init_packet(avpkt); avpkt->data = (void *)data; avpkt->size = size; //memset(avpkt->data + avpkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE); @@ -244,8 +248,12 @@ static void VideoEnqueue(const void *data, int size) avpkt->stream_index + size + FF_INPUT_BUFFER_PADDING_SIZE); av_grow_packet(avpkt, - (size + FF_INPUT_BUFFER_PADDING_SIZE + VIDEO_BUFFER_SIZE / 2) - / (VIDEO_BUFFER_SIZE / 2)); + ((size + FF_INPUT_BUFFER_PADDING_SIZE + VIDEO_BUFFER_SIZE / 2) + / (VIDEO_BUFFER_SIZE / 2)) * (VIDEO_BUFFER_SIZE / 2)); + if (avpkt->size < + avpkt->stream_index + size + FF_INPUT_BUFFER_PADDING_SIZE) { + abort(); + } } #ifdef DEBUG if (!avpkt->stream_index) { // debug save time of first packet @@ -504,8 +512,8 @@ void PlayVideo(const uint8_t * data, int size) if (data[7] & 0x80) { pts = (int64_t) (data[9] & 0x0E) << 29 | data[10] << 22 | (data[11] & - 0xFE) << 15 | data[12] << 7 | (data[13] & 0xFE) >> 1; - // Debug(3, "video: pts %ld\n", pts); + 0xFE) << 14 | data[12] << 7 | (data[13] & 0xFE) >> 1; + // Debug(3, "video: pts %#012" PRIx64 "\n", pts); } // FIXME: no valid mpeg2/h264 detection yet @@ -776,6 +784,13 @@ static void StartXServer(void) Error(_("x-setup: Failed to start X server '%s'\n"), args[0]); } +/** +** Exit + cleanup. +*/ +void SoftHdDeviceExit(void) +{ +} + /** ** Prepare plugin. */ diff --git a/softhddev.h b/softhddev.h index 34a87cd..4b82cce 100644 --- a/softhddev.h +++ b/softhddev.h @@ -55,6 +55,8 @@ extern "C" /// C plugin process the command line arguments extern int ProcessArgs(int, char *const[]); + /// C plugin exit + cleanup + extern void SoftHdDeviceExit(void); /// C plugin start code extern void Start(void); /// C plugin stop code diff --git a/softhddevice.cpp b/softhddevice.cpp index 532b5dd..9e011ed 100644 --- a/softhddevice.cpp +++ b/softhddevice.cpp @@ -219,7 +219,7 @@ class cSoftOsdProvider:public cOsdProvider cSoftOsdProvider(void); }; -cOsd *cSoftOsdProvider::Osd; +cOsd *cSoftOsdProvider::Osd; ///< single osd /** ** Create a new OSD. @@ -330,6 +330,8 @@ class cSoftHdDevice:public cDevice cSoftHdDevice::cSoftHdDevice(void) { dsyslog("[softhddev]%s\n", __FUNCTION__); + + spuDecoder = NULL; } cSoftHdDevice::~cSoftHdDevice(void) @@ -577,6 +579,8 @@ cPluginSoftHdDevice::~cPluginSoftHdDevice(void) { // Clean up after yourself! dsyslog("[softhddev]%s:\n", __FUNCTION__); + + ::SoftHdDeviceExit(); } const char *cPluginSoftHdDevice::Version(void)