summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Todo12
-rw-r--r--softhddev.c53
-rw-r--r--softhddev.h2
-rw-r--r--softhddevice.cpp6
4 files changed, 52 insertions, 21 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 <stdio.h>
#include <stdint.h>
+#include <inttypes.h>
#include <unistd.h>
#include <libintl.h>
@@ -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);
- }
- 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);
+ 0xFE) << 14 | data[12] << 7 | (data[13] & 0xFE) >> 1;
+ // Debug(3, "audio: pts %#012" PRIx64 "\n", avpkt->pts);
+ }
+ 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
@@ -777,6 +785,13 @@ static void StartXServer(void)
}
/**
+** Exit + cleanup.
+*/
+void SoftHdDeviceExit(void)
+{
+}
+
+/**
** Prepare plugin.
*/
void Start(void)
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)