summaryrefslogtreecommitdiff
path: root/softhddev.c
diff options
context:
space:
mode:
authorJohns <johns98@gmx.net>2013-10-08 10:13:38 +0200
committerJohns <johns98@gmx.net>2013-10-08 10:13:38 +0200
commite3b32861b051814418998a1b25a7231848b274ed (patch)
treeb08759f29d1d0aa136ec7796ee775aa38a941ea4 /softhddev.c
parent58a76439ee252df3cc34e66071286b13ed90e4f4 (diff)
downloadvdr-plugin-softhddevice-e3b32861b051814418998a1b25a7231848b274ed.tar.gz
vdr-plugin-softhddevice-e3b32861b051814418998a1b25a7231848b274ed.tar.bz2
Add function VideoStreamOpen and always use VideoStreamClose.
Diffstat (limited to 'softhddev.c')
-rw-r--r--softhddev.c88
1 files changed, 37 insertions, 51 deletions
diff --git a/softhddev.c b/softhddev.c
index b11e43a..91a031a 100644
--- a/softhddev.c
+++ b/softhddev.c
@@ -1743,22 +1743,40 @@ static void FixPacketForFFMpeg(VideoDecoder * vdecoder, AVPacket * avpkt)
#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.
**
** @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.
*/
-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;
if (stream->Decoder) {
VideoDecoder *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);
stream->Decoder = NULL; // lock read thread
pthread_mutex_unlock(&stream->DecoderLockMutex);
@@ -1766,7 +1784,9 @@ static void VideoStreamClose(VideoStream * stream)
CodecVideoDelDecoder(decoder);
}
if (stream->HwDecoder) {
- VideoDelHwDecoder(stream->HwDecoder);
+ if (delhw) {
+ VideoDelHwDecoder(stream->HwDecoder);
+ }
stream->HwDecoder = NULL;
// FIXME: CodecVideoClose calls/uses hw decoder
}
@@ -1796,13 +1816,14 @@ int VideoPollInput(VideoStream * stream)
}
if (stream->Close) { // close stream request
- VideoStreamClose(stream);
+ VideoStreamClose(stream, 1);
stream->Close = 0;
return 1;
}
if (stream->ClearBuffers) { // clear buffer request
atomic_set(&stream->PacketsFilled, 0);
stream->PacketRead = stream->PacketWrite;
+ // FIXME: ->Decoder already checked
if (stream->Decoder) {
CodecVideoFlushBuffers(stream->Decoder);
VideoResetStart(stream->HwDecoder);
@@ -1839,13 +1860,14 @@ int VideoDecodeInput(VideoStream * stream)
}
if (stream->Close) { // close stream request
- VideoStreamClose(stream);
+ VideoStreamClose(stream, 1);
stream->Close = 0;
return 1;
}
if (stream->ClearBuffers) { // clear buffer request
atomic_set(&stream->PacketsFilled, 0);
stream->PacketRead = stream->PacketWrite;
+ // FIXME: ->Decoder already checked
if (stream->Decoder) {
CodecVideoFlushBuffers(stream->Decoder);
VideoResetStart(stream->HwDecoder);
@@ -1988,17 +2010,8 @@ static void StartVideo(void)
}
VideoOsdInit();
if (!MyVideoStream->Decoder) {
- MyVideoStream->SkipStream = 1;
- MyVideoStream->CodecID = AV_CODEC_ID_NONE;
- MyVideoStream->LastCodecID = AV_CODEC_ID_NONE;
-
- if ((MyVideoStream->HwDecoder = VideoNewHwDecoder(MyVideoStream))) {
- MyVideoStream->Decoder =
- CodecVideoNewDecoder(MyVideoStream->HwDecoder);
- VideoPacketInit(MyVideoStream);
- AudioSyncStream = MyVideoStream;
- MyVideoStream->SkipStream = 0;
- }
+ VideoStreamOpen(MyVideoStream);
+ AudioSyncStream = MyVideoStream;
}
}
@@ -2010,6 +2023,10 @@ static void StopVideo(void)
VideoOsdExit();
VideoExit();
AudioSyncStream = NULL;
+#if 1
+ // FIXME: done by exit: VideoDelHwDecoder(MyVideoStream->HwDecoder);
+ VideoStreamClose(MyVideoStream, 0);
+#else
MyVideoStream->SkipStream = 1;
if (MyVideoStream->Decoder) {
VideoDecoder *decoder;
@@ -2030,6 +2047,7 @@ static void StopVideo(void)
MyVideoStream->NewStream = 1;
MyVideoStream->InvalidPesCounter = 0;
+#endif
}
#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) {
- PipVideoStream->SkipStream = 1;
- 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;
- }
+ VideoStreamOpen(PipVideoStream);
}
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);
-#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;
for (i = 0; PipVideoStream->Close && i < 50; ++i) {
usleep(1 * 1000);
}
Info("[softhddev]%s: pip close %dms\n", __FUNCTION__, i);
-#endif
}
/**