Add function VideoStreamOpen and always use VideoStreamClose.

This commit is contained in:
Johns 2013-10-08 10:13:38 +02:00
parent 58a76439ee
commit e3b32861b0
2 changed files with 38 additions and 51 deletions

View File

@ -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.

View File

@ -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
} }
/** /**