summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_nemesi.c
diff options
context:
space:
mode:
authorlu_zero <lu_zero@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-11-12 16:26:33 +0000
committerlu_zero <lu_zero@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-11-12 16:26:33 +0000
commit979c51209fe0509e67414a520c5104d92b8adb49 (patch)
treee17871e159c1aed20438c7e613f5d06b3a38328b /libmpdemux/demux_nemesi.c
parenta74197b43f95fc00e3ed046f766135a253bd2bcd (diff)
downloadmpv-979c51209fe0509e67414a520c5104d92b8adb49.tar.bz2
mpv-979c51209fe0509e67414a520c5104d92b8adb49.tar.xz
Refactor demux_nemesi (from amol)
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@25025 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/demux_nemesi.c')
-rw-r--r--libmpdemux/demux_nemesi.c132
1 files changed, 71 insertions, 61 deletions
diff --git a/libmpdemux/demux_nemesi.c b/libmpdemux/demux_nemesi.c
index d824ccf124..c4c9fc4ed5 100644
--- a/libmpdemux/demux_nemesi.c
+++ b/libmpdemux/demux_nemesi.c
@@ -38,6 +38,33 @@ typedef struct {
double seek;
} Nemesi_DemuxerStreamData;
+
+#define STYPE_TO_DS(demuxer, stype) \
+ ((stype) == NEMESI_SESSION_VIDEO ? (demuxer)->video : (demuxer)->audio)
+
+#define DS_TO_STYPE(demuxer, ds) \
+ ((ds) == (demuxer)->video ? NEMESI_SESSION_VIDEO : NEMESI_SESSION_AUDIO)
+
+#define INVERT_STYPE(stype) ((stype + 1) % 2)
+
+
+static rtp_ssrc *wait_for_packets(Nemesi_DemuxerStreamData * ndsd, Nemesi_SessionType stype)
+{
+ rtp_ssrc *ssrc = NULL;
+
+ /* Wait for prebuffering (prebuffering must be enabled in nemesi) */
+ int terminated = rtp_fill_buffers(rtsp_get_rtp_th(ndsd->rtsp));
+
+ /* Wait for the ssrc to be registered, if prebuffering is on in nemesi
+ this will just get immediatly the correct ssrc */
+ if (!terminated) {
+ while ( !(ssrc = rtp_session_get_ssrc(ndsd->session[stype], ndsd->rtsp)) )
+ sched_yield();
+ }
+
+ return ssrc;
+}
+
static void link_session_and_fetch_conf(Nemesi_DemuxerStreamData * ndsd,
Nemesi_SessionType stype,
rtp_session * sess,
@@ -45,28 +72,23 @@ static void link_session_and_fetch_conf(Nemesi_DemuxerStreamData * ndsd,
{
extern float force_fps;
rtp_ssrc *ssrc = NULL;
- rtsp_ctrl * ctl = ndsd->rtsp;
rtp_frame * fr = &ndsd->first_pkt[stype];
rtp_buff trash_buff;
ndsd->session[stype] = sess;
- if (buff == NULL)
- buff = &trash_buff;
+ ssrc = wait_for_packets(ndsd, stype);
- if ( (buff != NULL) || (fps != NULL) ) {
- while ( !(ssrc = rtp_session_get_ssrc(sess, ctl)) ) //Wait for the ssrc to be registered
- sched_yield();
+ if ( (ssrc) && (fps != NULL) ) {
+ if (buff == NULL)
+ buff = &trash_buff;
rtp_fill_buffer(ssrc, fr, buff); //Prefetch the first packet
-
- while ( !(rtp_get_pkt(ssrc, NULL)) ) //Wait for the second packet to calculate FPS
+ while ( !(rtp_get_pkt(ssrc, NULL)) ) //Wait second pkt to calculate FPS
sched_yield();
- if ( (force_fps == 0.0) && (fps != NULL) ) {
- rtp_fill_buffers(rtsp_get_rtp_th(ctl));
+ if ( (force_fps == 0.0) && (fps != NULL) )
*fps = rtp_get_fps(ssrc);
- }
}
}
@@ -241,75 +263,63 @@ demuxer_t* demux_open_rtp(demuxer_t* demuxer)
}
static int get_data_for_session(Nemesi_DemuxerStreamData * ndsd,
- Nemesi_SessionType stype, rtp_frame * fr)
+ Nemesi_SessionType stype, rtp_ssrc * ssrc,
+ rtp_frame * fr)
{
- rtsp_ctrl * ctl = ndsd->rtsp;
- rtp_ssrc *ssrc = NULL;
-
- for (ssrc = rtp_active_ssrc_queue(rtsp_get_rtp_queue(ctl));
- ssrc;
- ssrc = rtp_next_active_ssrc(ssrc)) {
- if (ssrc->rtp_sess == ndsd->session[stype]) {
- if (ndsd->first_pkt[stype].len != 0) {
- fr->data = ndsd->first_pkt[stype].data;
- fr->time_sec = ndsd->first_pkt[stype].time_sec;
- fr->len = ndsd->first_pkt[stype].len;
- ndsd->first_pkt[stype].len = 0;
- return RTP_FILL_OK;
- } else {
- rtp_buff buff;
- return rtp_fill_buffer(ssrc, fr, &buff);
- }
- }
+ if (ndsd->first_pkt[stype].len != 0) {
+ fr->data = ndsd->first_pkt[stype].data;
+ fr->time_sec = ndsd->first_pkt[stype].time_sec;
+ fr->len = ndsd->first_pkt[stype].len;
+ ndsd->first_pkt[stype].len = 0;
+ return RTP_FILL_OK;
+ } else {
+ rtp_buff buff;
+ return rtp_fill_buffer(ssrc, fr, &buff);
}
+}
+
+static void stream_add_packet(Nemesi_DemuxerStreamData * ndsd,
+ Nemesi_SessionType stype,
+ demux_stream_t* ds, rtp_frame * fr)
+{
+ demux_packet_t* dp = new_demux_packet(fr->len);
+ memcpy(dp->buffer, fr->data, fr->len);
- return RTP_SSRC_NOTVALID;
+ fr->time_sec += ndsd->seek;
+ ndsd->time[stype] = dp->pts = fr->time_sec;
+
+ ds_add_packet(ds, dp);
}
int demux_rtp_fill_buffer(demuxer_t* demuxer, demux_stream_t* ds)
{
Nemesi_DemuxerStreamData * ndsd = demuxer->priv;
Nemesi_SessionType stype;
- rtsp_ctrl * ctl = ndsd->rtsp;
- rtp_thread * rtp_th = rtsp_get_rtp_th(ctl);
+ rtp_ssrc * ssrc;
rtp_frame fr;
- demux_packet_t* dp;
-
- if ( (!ctl->rtsp_queue) || (demuxer->stream->eof) || (rtp_fill_buffers(rtp_th)) ) {
+ if ( (!ndsd->rtsp->rtsp_queue) || (demuxer->stream->eof) ) {
mp_msg(MSGT_DEMUX, MSGL_INFO, "End of Stream...\n");
demuxer->stream->eof = 1;
return 0;
}
- if (ds == demuxer->video)
- stype = NEMESI_SESSION_VIDEO;
- else if (ds == demuxer->audio)
- stype = NEMESI_SESSION_AUDIO;
- else
+ stype = DS_TO_STYPE(demuxer, ds);
+ if ( (ssrc = wait_for_packets(ndsd, stype)) == NULL ) {
+ mp_msg(MSGT_DEMUX, MSGL_INFO, "Bye...\n");
+ demuxer->stream->eof = 1;
return 0;
-
- if(!get_data_for_session(ndsd, stype, &fr)) {
- dp = new_demux_packet(fr.len);
- memcpy(dp->buffer, fr.data, fr.len);
- fr.time_sec += ndsd->seek;
- ndsd->time[stype] = dp->pts = fr.time_sec;
- ds_add_packet(ds, dp);
}
+
+ if(!get_data_for_session(ndsd, stype, ssrc, &fr))
+ stream_add_packet(ndsd, stype, ds, &fr);
else {
- stype = (stype + 1) % 2;
- if (stype == NEMESI_SESSION_VIDEO)
- ds = demuxer->video;
- else
- ds = demuxer->audio;
-
- if(!get_data_for_session(ndsd, stype, &fr)) {
- dp = new_demux_packet(fr.len);
- memcpy(dp->buffer, fr.data, fr.len);
- fr.time_sec += ndsd->seek;
- ndsd->time[stype] = dp->pts = fr.time_sec;
- ds_add_packet(ds, dp);
- }
+ stype = INVERT_STYPE(stype);
+ ds = STYPE_TO_DS(demuxer, stype);
+ ssrc = wait_for_packets(ndsd, stype);
+
+ if(!get_data_for_session(ndsd, stype, ssrc, &fr))
+ stream_add_packet(ndsd, stype, ds, &fr);
}
return 1;