summaryrefslogtreecommitdiffstats
path: root/stream/tv.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-07-11 19:17:05 +0200
committerwm4 <wm4@nowhere>2013-07-11 19:17:05 +0200
commitfa74be880c27b350615f62dd4a0d6a32be56c60e (patch)
tree6d6041693f2066cea40f20d68f914331d0905ad9 /stream/tv.c
parent11383696dbfdcd54c3d4637ee027e0fddd420f87 (diff)
downloadmpv-fa74be880c27b350615f62dd4a0d6a32be56c60e.tar.bz2
mpv-fa74be880c27b350615f62dd4a0d6a32be56c60e.tar.xz
tv: add hack in preparation of demux_stream removal
Currently, all demuxer fill_buffer functions have a demux_stream parameter. We want to remove that, but the TV code still depends on it. Add a hack to remove that dependency. The problem with the TV code is that reading video and audio frames blocks, so in order to avoid a deadlock, you should read either of them only if the decoder actually requests new data.
Diffstat (limited to 'stream/tv.c')
-rw-r--r--stream/tv.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/stream/tv.c b/stream/tv.c
index 72b67b7f9e..0f09bb3448 100644
--- a/stream/tv.c
+++ b/stream/tv.c
@@ -215,10 +215,23 @@ static int demux_tv_fill_buffer(demuxer_t *demux, demux_stream_t *ds)
tvi_handle_t *tvh=(tvi_handle_t*)(demux->priv);
demux_packet_t* dp;
unsigned int len=0;
+ struct sh_stream *want_audio = NULL, *want_video = NULL;
+
+ for (int n = 0; n < demux->num_streams; n++) {
+ struct sh_stream *sh = demux->streams[n];
+ if (!demuxer_stream_has_packets_queued(demux, sh) &&
+ demuxer_stream_is_selected(demux, sh))
+ {
+ if (sh->type == STREAM_AUDIO)
+ want_audio = sh;
+ if (sh->type == STREAM_VIDEO)
+ want_video = sh;
+ }
+ }
/* ================== ADD AUDIO PACKET =================== */
- if (ds==demux->audio && tvh->tv_param->noaudio == 0 &&
+ if (want_audio && tvh->tv_param->noaudio == 0 &&
tvh->functions->control(tvh->priv,
TVI_CONTROL_IS_AUDIO, 0) == TVI_CONTROL_TRUE)
{
@@ -227,19 +240,19 @@ static int demux_tv_fill_buffer(demuxer_t *demux, demux_stream_t *ds)
dp=new_demux_packet(len);
dp->keyframe = true;
dp->pts=tvh->functions->grab_audio_frame(tvh->priv, dp->buffer,len);
- ds_add_packet(demux->audio,dp);
+ demuxer_add_packet(demux, want_audio, dp);
}
/* ================== ADD VIDEO PACKET =================== */
- if (ds==demux->video && tvh->functions->control(tvh->priv,
+ if (want_video && tvh->functions->control(tvh->priv,
TVI_CONTROL_IS_VIDEO, 0) == TVI_CONTROL_TRUE)
{
len = tvh->functions->get_video_framesize(tvh->priv);
dp=new_demux_packet(len);
dp->keyframe = true;
dp->pts=tvh->functions->grab_video_frame(tvh->priv, dp->buffer, len);
- ds_add_packet(demux->video,dp);
+ demuxer_add_packet(demux, want_video, dp);
}
if (tvh->tv_param->scan) tv_scan(tvh);