summaryrefslogtreecommitdiff
path: root/gst/realmedia/rmdemux.h
blob: 4ebe6b06904e8e137ef1c874320640e4d2ac2fb8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/* GStreamer RealMedia demuxer
 * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */


#ifndef __GST_RMDEMUX_H__
#define __GST_RMDEMUX_H__

#include <gst/gst.h>
#include <gst/base/gstadapter.h>

G_BEGIN_DECLS

#define GST_TYPE_RMDEMUX \
  (gst_rmdemux_get_type())
#define GST_RMDEMUX(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RMDEMUX,GstRMDemux))
#define GST_RMDEMUX_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RMDEMUX,GstRMDemuxClass))
#define GST_IS_RMDEMUX(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RMDEMUX))
#define GST_IS_RMDEMUX_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RMDEMUX))

typedef enum
{
  RMDEMUX_STATE_NULL,
  RMDEMUX_STATE_HEADER,
  RMDEMUX_STATE_HEADER_UNKNOWN,
  RMDEMUX_STATE_HEADER_RMF,
  RMDEMUX_STATE_HEADER_PROP,
  RMDEMUX_STATE_HEADER_MDPR,
  RMDEMUX_STATE_HEADER_INDX,
  RMDEMUX_STATE_HEADER_DATA,
  RMDEMUX_STATE_HEADER_CONT,
  RMDEMUX_STATE_HEADER_SEEKING,
  RMDEMUX_STATE_SEEKING,
  RMDEMUX_STATE_DATA_PACKET,
  RMDEMUX_STATE_SEEKING_EOS,
  RMDEMUX_STATE_EOS,
  RMDEMUX_STATE_INDX_DATA
} GstRMDemuxState;

typedef enum
{
  RMDEMUX_LOOP_STATE_HEADER,
  RMDEMUX_LOOP_STATE_INDEX,
  RMDEMUX_LOOP_STATE_DATA
} GstRMDemuxLoopState;

typedef enum
{
  GST_RMDEMUX_STREAM_UNKNOWN,
  GST_RMDEMUX_STREAM_VIDEO,
  GST_RMDEMUX_STREAM_AUDIO,
  GST_RMDEMUX_STREAM_FILEINFO
} GstRMDemuxStreamType;

typedef struct _GstRMDemux GstRMDemux;
typedef struct _GstRMDemuxClass GstRMDemuxClass;
typedef struct _GstRMDemuxStream GstRMDemuxStream;

struct _GstRMDemux {
  GstElement element;

  /* pads */
  GstPad *sinkpad;

  GSList *streams;
  int n_video_streams;
  int n_audio_streams;
  GstAdapter *adapter;
  gboolean have_pads;

  guint32 timescale;
  guint64 duration;
  guint32 avg_packet_size;
  guint32 index_offset;
  guint32 data_offset;
  guint32 num_packets;

  guint offset;
  gboolean seekable;

  GstRMDemuxState state;
  GstRMDemuxLoopState loop_state;
  GstRMDemuxStream *index_stream;

  /* playback start/stop positions */
  GstSegment segment;
  gboolean segment_running;
  gboolean running;

  /* Whether we need to send a newsegment event */
  gboolean need_newsegment;

  /* Current timestamp */
  GstClockTime cur_timestamp;

  /* First timestamp */
  GstClockTime base_ts;
  GstClockTime first_ts;

  int n_chunks;
  int chunk_index;

  guint32 object_id;
  guint32 size;
  guint16 object_version;
};

struct _GstRMDemuxClass {
  GstElementClass parent_class;
};

/* RealMedia VideoCodec FOURCC codes */
#define GST_RM_VDO_RV10 GST_MAKE_FOURCC('R','V','1','0') // RealVideo 1
#define GST_RM_VDO_RV20 GST_MAKE_FOURCC('R','V','2','0') // RealVideo G2
#define GST_RM_VDO_RV30 GST_MAKE_FOURCC('R','V','3','0') // RealVideo 8
#define GST_RM_VDO_RV40 GST_MAKE_FOURCC('R','V','4','0') // RealVideo 9+10

/* RealMedia AudioCodec FOURCC codes */
#define GST_RM_AUD_14_4 GST_MAKE_FOURCC('1','4','_','4') // 14.4 Audio Codec
#define GST_RM_AUD_28_8 GST_MAKE_FOURCC('2','8','_','8') // 28.8 Audio Codec
#define GST_RM_AUD_COOK GST_MAKE_FOURCC('c','o','o','k') // Cooker G2 Audio Codec
#define GST_RM_AUD_DNET GST_MAKE_FOURCC('d','n','e','t') // DolbyNet Audio Codec (low bitrate Dolby AC3)
#define GST_RM_AUD_SIPR GST_MAKE_FOURCC('s','i','p','r') // Sipro/ACELP.NET Voice Codec
#define GST_RM_AUD_RAAC GST_MAKE_FOURCC('r','a','a','c') // LE-AAC Audio Codec
#define GST_RM_AUD_RACP GST_MAKE_FOURCC('r','a','c','p') // HE-AAC Audio Codec
#define GST_RM_AUD_RALF GST_MAKE_FOURCC('r','a','l','f') // RealAudio Lossless
#define GST_RM_AUD_ATRC GST_MAKE_FOURCC('a','t','r','c') // Sony ATRAC3 Audio Codec

#define GST_RM_AUD_xRA4 GST_MAKE_FOURCC('.','r','a','4') // Not a real audio codec
#define GST_RM_AUD_xRA5 GST_MAKE_FOURCC('.','r','a','5') // Not a real audio codec

gboolean gst_rmdemux_plugin_init (GstPlugin * plugin);

G_END_DECLS

#endif /* __GST_RMDEMUX_H__ */