Refactor demux_nemesi (from amol)

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@25025 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
lu_zero 2007-11-12 16:26:33 +00:00
parent a74197b43f
commit 979c51209f
1 changed files with 71 additions and 61 deletions

View File

@ -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);
}
}
return RTP_SSRC_NOTVALID;
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);
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);
}
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);
}
if(!get_data_for_session(ndsd, stype, ssrc, &fr))
stream_add_packet(ndsd, stype, ds, &fr);
else {
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;