aboutsummaryrefslogtreecommitdiff
path: root/include/pdp_mp4playermedia.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/pdp_mp4playermedia.h')
-rw-r--r--include/pdp_mp4playermedia.h232
1 files changed, 232 insertions, 0 deletions
diff --git a/include/pdp_mp4playermedia.h b/include/pdp_mp4playermedia.h
new file mode 100644
index 0000000..025fb57
--- /dev/null
+++ b/include/pdp_mp4playermedia.h
@@ -0,0 +1,232 @@
+/*
+ * The contents of this file are subject to the Mozilla Public
+ * License Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ * The Original Code is MPEG4IP.
+ *
+ * The Initial Developer of the Original Code is Cisco Systems Inc.
+ * Portions created by Cisco Systems Inc. are
+ * Copyright (C) Cisco Systems Inc. 2000, 2001. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Bill May wmay@cisco.com
+ *
+ * Adapted to PD/PDP by Yves Degoyon (ydegoyon@free.fr)
+ */
+
+/*
+ * player_media.h - provides CPlayerMedia class, which defines the
+ * interface to a particular media steam.
+ */
+
+#ifndef __PLAYER_MEDIA_H__
+#define __PLAYER_MEDIA_H__
+
+#include <SDL.h>
+#include <SDL_thread.h>
+#include <sdp/sdp.h>
+#include <rtsp/rtsp_client.h>
+#include <rtp/rtp.h>
+#include "our_bytestream.h"
+#include "our_msg_queue.h"
+#include "codec_plugin.h"
+
+class CPlayerSession;
+class CPDPAudioSync;
+class CPDPVideoSync;
+class C2ConsecIpPort;
+class COurInByteStream;
+class CRtpByteStreamBase;
+
+class CPlayerMedia {
+ public:
+ CPlayerMedia(CPlayerSession *p);
+ ~CPlayerMedia();
+ /* API routine - create - for RTP stream */
+ int create_streaming(media_desc_t *sdp_media,
+ char *errmsg,
+ uint32_t errlen,
+ int on_demand,
+ int use_rtsp,
+ int media_number_in_session);
+ /* API routine - create - where we provide the bytestream */
+ int create(COurInByteStream *b,
+ int is_video,
+ char *errmsg = NULL,
+ uint32_t errlen = 0,
+ int streaming = 0);
+ /* API routine - play, pause */
+ int do_play(double start_time_offset, char *errmsg, uint32_t errlen);
+ int do_pause(void);
+ int is_video(void) { return (m_is_video); };
+ double get_max_playtime(void);
+ /* API routine - interface for decoding start/continue */
+ void start_decoding(void);
+ void bytestream_primed(void);
+ /* API routine - ip port information */
+ uint16_t get_our_port (void) { return m_our_port; };
+ void set_server_port (uint16_t port) { m_server_port = port; };
+ uint16_t get_server_port (void) { return m_server_port; };
+
+ media_desc_t *get_sdp_media_desc (void) { return m_media_info; };
+ void set_source_addr (char *s)
+ {
+ if (m_source_addr != NULL) free(m_source_addr);
+ m_source_addr = s;
+ }
+ const char *get_source_addr(void);
+ CPlayerMedia *get_next (void) { return m_next; };
+ void set_next (CPlayerMedia *newone) { m_next = newone; };
+ int decode_thread(void);
+
+ /* Public RTP routines - receive thread, callback, and routines to
+ * pass information from rtsp to rtp byte stream
+ */
+ int recv_thread(void);
+ void recv_callback(struct rtp *session, rtp_event *e);
+ void set_rtp_ssrc (uint32_t ssrc)
+ { m_rtp_ssrc = ssrc; m_rtp_ssrc_set = TRUE;};
+ void set_rtp_base_ts(uint32_t time);
+ void set_rtp_base_seq(uint16_t seq);
+
+ void set_video_sync(CPDPVideoSync *p) {m_video_sync = p;};
+ void set_audio_sync(CPDPAudioSync *p) {m_audio_sync = p;};
+
+ const video_info_t *get_video_info (void) { return m_video_info; };
+ const audio_info_t *get_audio_info (void) { return m_audio_info; };
+
+ int create_video_plugin(const codec_plugin_t *p,
+ const char *compressor,
+ int profile,
+ int type,
+ format_list_t *sdp_media,
+ video_info_t *video,
+ const uint8_t *user_data,
+ uint32_t userdata_size);
+ int create_audio_plugin(const codec_plugin_t *p,
+ const char *compressor,
+ int profile,
+ int type,
+ format_list_t *sdp_media,
+ audio_info_t *audio,
+ const uint8_t *user_data,
+ uint32_t userdata_size);
+ void set_plugin_data (const codec_plugin_t *p,
+ codec_data_t *d,
+ video_vft_t *v,
+ audio_vft_t *a);
+ int get_plugin_status(char *buffer, uint32_t buflen);
+ void set_user_data (const uint8_t *udata, int length) {
+ m_user_data = udata;
+ m_user_data_size = length;
+ }
+ rtsp_session_t *get_rtsp_session(void) { return m_rtsp_session; };
+ void rtp_init_tcp(void);
+ void rtp_periodic(void);
+ void rtp_start(void);
+ void rtp_end(void);
+ int rtp_receive_packet(unsigned char interleaved, struct rtp_packet *, int len);
+ int rtcp_send_packet(uint8_t *buffer, int buflen);
+ int get_rtp_media_number (void) { return m_rtp_media_number_in_session; };
+ void syncronize_rtp_bytestreams(rtcp_sync_t *sync);
+ private:
+ int create_common(int is_video, char *errmsg, uint32_t errlen);
+ void wait_on_bytestream(void);
+ int m_streaming;
+ int m_is_video;
+ int m_paused;
+ CPlayerMedia *m_next;
+ CPlayerSession *m_parent;
+ media_desc_t *m_media_info;
+ format_list_t *m_media_fmt; // format currently running.
+ rtsp_session_t *m_rtsp_session;
+ C2ConsecIpPort *m_ports;
+ in_port_t m_our_port;
+ in_port_t m_server_port;
+ char *m_source_addr;
+
+ time_t m_start_time;
+ int m_stream_ondemand;
+ int m_sync_time_set;
+ uint64_t m_sync_time_offset;
+ uint32_t m_rtptime_tickpersec;
+ double m_play_start_time;
+ // Receive thread variables
+ SDL_Thread *m_recv_thread;
+
+ /*************************************************************************
+ * RTP variables - used to pass info to the bytestream
+ *************************************************************************/
+ int m_rtp_ondemand;
+ int m_rtp_use_rtsp;
+ int m_rtp_media_number_in_session;
+ int m_rtp_buffering;
+ struct rtp *m_rtp_session;
+ CRtpByteStreamBase *m_rtp_byte_stream;
+ CMsgQueue m_rtp_msg_queue;
+
+ rtp_packet *m_head, *m_tail;
+ uint32_t m_rtp_queue_len;
+
+ // from rtsp...
+ int m_rtp_ssrc_set;
+ uint32_t m_rtp_ssrc;
+ int m_rtsp_base_ts_received;
+ uint32_t m_rtp_base_ts;
+ int m_rtsp_base_seq_received;
+ uint16_t m_rtp_base_seq;
+
+ int determine_payload_type_from_rtp(void);
+ void create_rtp_byte_stream(uint8_t payload, uint64_t tps, format_list_t *fmt);
+ void clear_rtp_packets(void);
+
+ // from rtcp, for broadcast, in case we get an RTCP before we determine
+ // the payload type
+ uint32_t m_rtcp_ntp_frac;
+ uint32_t m_rtcp_ntp_sec;
+ uint32_t m_rtcp_rtp_ts;
+ int m_rtcp_received;
+
+ volatile int m_rtp_inited;
+
+ /*************************************************************************
+ * Decoder thread variables
+ *************************************************************************/
+ SDL_Thread *m_decode_thread;
+ volatile int m_decode_thread_waiting;
+ SDL_sem *m_decode_thread_sem;
+
+ const codec_plugin_t *m_plugin;
+ codec_data_t *m_plugin_data;
+
+ // State change variable
+ CMsgQueue m_decode_msg_queue;
+ // Private routines
+ int process_rtsp_transport(char *transport);
+ CPDPAudioSync *m_audio_sync;
+ CPDPVideoSync *m_video_sync;
+ void parse_decode_message(int &thread_stop, int &decoding);
+ COurInByteStream *m_byte_stream;
+ video_info_t *m_video_info;
+ audio_info_t *m_audio_info;
+
+ const uint8_t *m_user_data;
+ int m_user_data_size;
+
+};
+
+int pdp_process_rtsp_rtpinfo(char *rtpinfo, CPlayerSession *session, CPlayerMedia *media);
+
+extern audio_vft_t audio_vft;
+extern video_vft_t video_vft;
+
+#define media_message(loglevel, fmt...) message(loglevel, "media", fmt)
+
+#endif