mirror of
https://projects.vdr-developer.org/git/vdr-plugin-softhddevice.git
synced 2023-10-10 19:16:51 +02:00
Add function VideoStreamOpen and always use VideoStreamClose.
This commit is contained in:
parent
58a76439ee
commit
e3b32861b0
@ -1,6 +1,7 @@
|
|||||||
User johns
|
User johns
|
||||||
Date:
|
Date:
|
||||||
|
|
||||||
|
Add function VideoStreamOpen and always use VideoStreamClose.
|
||||||
Softer audio/video sync.
|
Softer audio/video sync.
|
||||||
Add function GetStats to the video output module.
|
Add function GetStats to the video output module.
|
||||||
Add function ResetStart to the video output module.
|
Add function ResetStart to the video output module.
|
||||||
|
88
softhddev.c
88
softhddev.c
@ -1742,23 +1742,41 @@ static void FixPacketForFFMpeg(VideoDecoder * vdecoder, AVPacket * avpkt)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
** Open video stream.
|
||||||
|
**
|
||||||
|
** @param stream video stream
|
||||||
|
*/
|
||||||
|
static void VideoStreamOpen(VideoStream * stream)
|
||||||
|
{
|
||||||
|
stream->SkipStream = 1;
|
||||||
|
stream->CodecID = AV_CODEC_ID_NONE;
|
||||||
|
stream->LastCodecID = AV_CODEC_ID_NONE;
|
||||||
|
|
||||||
|
if ((stream->HwDecoder = VideoNewHwDecoder(stream))) {
|
||||||
|
stream->Decoder = CodecVideoNewDecoder(stream->HwDecoder);
|
||||||
|
VideoPacketInit(stream);
|
||||||
|
stream->SkipStream = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
** Close video stream.
|
** Close video stream.
|
||||||
**
|
**
|
||||||
** @param stream video stream
|
** @param stream video stream
|
||||||
|
** @param delhw flag delete hardware decoder
|
||||||
**
|
**
|
||||||
** @note must be called from the video thread, othewise xcb has a
|
** @note must be called from the video thread, otherwise xcb has a
|
||||||
** deadlock.
|
** deadlock.
|
||||||
*/
|
*/
|
||||||
static void VideoStreamClose(VideoStream * stream)
|
static void VideoStreamClose(VideoStream * stream, int delhw)
|
||||||
{
|
{
|
||||||
// FIXME: use this function to close the main video stream!
|
|
||||||
stream->SkipStream = 1;
|
stream->SkipStream = 1;
|
||||||
if (stream->Decoder) {
|
if (stream->Decoder) {
|
||||||
VideoDecoder *decoder;
|
VideoDecoder *decoder;
|
||||||
|
|
||||||
decoder = stream->Decoder;
|
decoder = stream->Decoder;
|
||||||
// FIXME: this lock shouldn't be necessary now
|
// FIXME: remove this lock for main stream close
|
||||||
pthread_mutex_lock(&stream->DecoderLockMutex);
|
pthread_mutex_lock(&stream->DecoderLockMutex);
|
||||||
stream->Decoder = NULL; // lock read thread
|
stream->Decoder = NULL; // lock read thread
|
||||||
pthread_mutex_unlock(&stream->DecoderLockMutex);
|
pthread_mutex_unlock(&stream->DecoderLockMutex);
|
||||||
@ -1766,7 +1784,9 @@ static void VideoStreamClose(VideoStream * stream)
|
|||||||
CodecVideoDelDecoder(decoder);
|
CodecVideoDelDecoder(decoder);
|
||||||
}
|
}
|
||||||
if (stream->HwDecoder) {
|
if (stream->HwDecoder) {
|
||||||
VideoDelHwDecoder(stream->HwDecoder);
|
if (delhw) {
|
||||||
|
VideoDelHwDecoder(stream->HwDecoder);
|
||||||
|
}
|
||||||
stream->HwDecoder = NULL;
|
stream->HwDecoder = NULL;
|
||||||
// FIXME: CodecVideoClose calls/uses hw decoder
|
// FIXME: CodecVideoClose calls/uses hw decoder
|
||||||
}
|
}
|
||||||
@ -1796,13 +1816,14 @@ int VideoPollInput(VideoStream * stream)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (stream->Close) { // close stream request
|
if (stream->Close) { // close stream request
|
||||||
VideoStreamClose(stream);
|
VideoStreamClose(stream, 1);
|
||||||
stream->Close = 0;
|
stream->Close = 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (stream->ClearBuffers) { // clear buffer request
|
if (stream->ClearBuffers) { // clear buffer request
|
||||||
atomic_set(&stream->PacketsFilled, 0);
|
atomic_set(&stream->PacketsFilled, 0);
|
||||||
stream->PacketRead = stream->PacketWrite;
|
stream->PacketRead = stream->PacketWrite;
|
||||||
|
// FIXME: ->Decoder already checked
|
||||||
if (stream->Decoder) {
|
if (stream->Decoder) {
|
||||||
CodecVideoFlushBuffers(stream->Decoder);
|
CodecVideoFlushBuffers(stream->Decoder);
|
||||||
VideoResetStart(stream->HwDecoder);
|
VideoResetStart(stream->HwDecoder);
|
||||||
@ -1839,13 +1860,14 @@ int VideoDecodeInput(VideoStream * stream)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (stream->Close) { // close stream request
|
if (stream->Close) { // close stream request
|
||||||
VideoStreamClose(stream);
|
VideoStreamClose(stream, 1);
|
||||||
stream->Close = 0;
|
stream->Close = 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (stream->ClearBuffers) { // clear buffer request
|
if (stream->ClearBuffers) { // clear buffer request
|
||||||
atomic_set(&stream->PacketsFilled, 0);
|
atomic_set(&stream->PacketsFilled, 0);
|
||||||
stream->PacketRead = stream->PacketWrite;
|
stream->PacketRead = stream->PacketWrite;
|
||||||
|
// FIXME: ->Decoder already checked
|
||||||
if (stream->Decoder) {
|
if (stream->Decoder) {
|
||||||
CodecVideoFlushBuffers(stream->Decoder);
|
CodecVideoFlushBuffers(stream->Decoder);
|
||||||
VideoResetStart(stream->HwDecoder);
|
VideoResetStart(stream->HwDecoder);
|
||||||
@ -1988,17 +2010,8 @@ static void StartVideo(void)
|
|||||||
}
|
}
|
||||||
VideoOsdInit();
|
VideoOsdInit();
|
||||||
if (!MyVideoStream->Decoder) {
|
if (!MyVideoStream->Decoder) {
|
||||||
MyVideoStream->SkipStream = 1;
|
VideoStreamOpen(MyVideoStream);
|
||||||
MyVideoStream->CodecID = AV_CODEC_ID_NONE;
|
AudioSyncStream = MyVideoStream;
|
||||||
MyVideoStream->LastCodecID = AV_CODEC_ID_NONE;
|
|
||||||
|
|
||||||
if ((MyVideoStream->HwDecoder = VideoNewHwDecoder(MyVideoStream))) {
|
|
||||||
MyVideoStream->Decoder =
|
|
||||||
CodecVideoNewDecoder(MyVideoStream->HwDecoder);
|
|
||||||
VideoPacketInit(MyVideoStream);
|
|
||||||
AudioSyncStream = MyVideoStream;
|
|
||||||
MyVideoStream->SkipStream = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2010,6 +2023,10 @@ static void StopVideo(void)
|
|||||||
VideoOsdExit();
|
VideoOsdExit();
|
||||||
VideoExit();
|
VideoExit();
|
||||||
AudioSyncStream = NULL;
|
AudioSyncStream = NULL;
|
||||||
|
#if 1
|
||||||
|
// FIXME: done by exit: VideoDelHwDecoder(MyVideoStream->HwDecoder);
|
||||||
|
VideoStreamClose(MyVideoStream, 0);
|
||||||
|
#else
|
||||||
MyVideoStream->SkipStream = 1;
|
MyVideoStream->SkipStream = 1;
|
||||||
if (MyVideoStream->Decoder) {
|
if (MyVideoStream->Decoder) {
|
||||||
VideoDecoder *decoder;
|
VideoDecoder *decoder;
|
||||||
@ -2030,6 +2047,7 @@ static void StopVideo(void)
|
|||||||
|
|
||||||
MyVideoStream->NewStream = 1;
|
MyVideoStream->NewStream = 1;
|
||||||
MyVideoStream->InvalidPesCounter = 0;
|
MyVideoStream->InvalidPesCounter = 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -3426,16 +3444,7 @@ void PipStart(int x, int y, int width, int height, int pip_x, int pip_y,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!PipVideoStream->Decoder) {
|
if (!PipVideoStream->Decoder) {
|
||||||
PipVideoStream->SkipStream = 1;
|
VideoStreamOpen(PipVideoStream);
|
||||||
PipVideoStream->CodecID = AV_CODEC_ID_NONE;
|
|
||||||
PipVideoStream->LastCodecID = AV_CODEC_ID_NONE;
|
|
||||||
|
|
||||||
if ((PipVideoStream->HwDecoder = VideoNewHwDecoder(PipVideoStream))) {
|
|
||||||
PipVideoStream->Decoder =
|
|
||||||
CodecVideoNewDecoder(PipVideoStream->HwDecoder);
|
|
||||||
VideoPacketInit(PipVideoStream);
|
|
||||||
PipVideoStream->SkipStream = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
PipSetPosition(x, y, width, height, pip_x, pip_y, pip_width, pip_height);
|
PipSetPosition(x, y, width, height, pip_x, pip_y, pip_width, pip_height);
|
||||||
}
|
}
|
||||||
@ -3453,34 +3462,11 @@ void PipStop(void)
|
|||||||
|
|
||||||
ScaleVideo(0, 0, 0, 0);
|
ScaleVideo(0, 0, 0, 0);
|
||||||
|
|
||||||
#if 0
|
|
||||||
PipVideoStream->SkipStream = 1; // lock write thread
|
|
||||||
if (PipVideoStream->Decoder) {
|
|
||||||
VideoDecoder *decoder;
|
|
||||||
|
|
||||||
decoder = PipVideoStream->Decoder;
|
|
||||||
pthread_mutex_lock(&PipVideoStream->DecoderLockMutex);
|
|
||||||
PipVideoStream->Decoder = NULL; // lock read thread
|
|
||||||
pthread_mutex_unlock(&PipVideoStream->DecoderLockMutex);
|
|
||||||
CodecVideoClose(decoder);
|
|
||||||
CodecVideoDelDecoder(decoder);
|
|
||||||
}
|
|
||||||
if (PipVideoStream->HwDecoder) {
|
|
||||||
VideoDelHwDecoder(PipVideoStream->HwDecoder);
|
|
||||||
PipVideoStream->HwDecoder = NULL;
|
|
||||||
// FIXME: CodecVideoClose calls/uses hw decoder
|
|
||||||
}
|
|
||||||
VideoPacketExit(PipVideoStream);
|
|
||||||
|
|
||||||
PipVideoStream->NewStream = 1;
|
|
||||||
PipVideoStream->InvalidPesCounter = 0;
|
|
||||||
#else
|
|
||||||
PipVideoStream->Close = 1;
|
PipVideoStream->Close = 1;
|
||||||
for (i = 0; PipVideoStream->Close && i < 50; ++i) {
|
for (i = 0; PipVideoStream->Close && i < 50; ++i) {
|
||||||
usleep(1 * 1000);
|
usleep(1 * 1000);
|
||||||
}
|
}
|
||||||
Info("[softhddev]%s: pip close %dms\n", __FUNCTION__, i);
|
Info("[softhddev]%s: pip close %dms\n", __FUNCTION__, i);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user