mirror of
				https://projects.vdr-developer.org/git/vdr-plugin-softhddevice.git
				synced 2023-10-10 17:16:51 +00:00 
			
		
		
		
	Pass audio PTS to codec.
Correct PTS extraction and pass it to codec module. C++ destructor calls C function. Fix spuDecoder is used uninitialized.
This commit is contained in:
		
							
								
								
									
										12
									
								
								Todo
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										51
									
								
								softhddev.c
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								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);
 | 
			
		||||
	    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.
 | 
			
		||||
*/
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user