author | Wolfgang Rosenauer <wr@rosenauer.org> |
Thu, 28 Feb 2013 23:25:28 +0100 | |
branch | firefox20 |
changeset 625 | 9f6e14430916 |
child 627 | cc7671532e60 |
permissions | -rw-r--r-- |
625
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
1 |
# HG changeset patch |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
2 |
# Parent fb80f99ca86bacbcddaf203f7183e0456f194811 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
3 |
# User Mike Gorse <mgorse@suse.com> |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
4 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
5 |
Bug 806917 - support GStreamer 1.0 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
6 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
7 |
diff --git a/configure.in b/configure.in |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
8 |
--- a/configure.in |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
9 |
+++ b/configure.in |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
10 |
@@ -5758,28 +5758,36 @@ fi |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
11 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
12 |
AC_SUBST(MOZ_PULSEAUDIO) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
13 |
AC_SUBST(MOZ_PULSEAUDIO_CFLAGS) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
14 |
AC_SUBST(MOZ_PULSEAUDIO_LIBS) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
15 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
16 |
dnl ======================================================== |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
17 |
dnl = Enable GStreamer |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
18 |
dnl ======================================================== |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
19 |
-MOZ_ARG_ENABLE_BOOL(gstreamer, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
20 |
-[ --enable-gstreamer Enable GStreamer support], |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
21 |
-MOZ_GSTREAMER=1, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
22 |
-MOZ_GSTREAMER=) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
23 |
+MOZ_ARG_ENABLE_STRING(gstreamer, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
24 |
+[ --enable-gstreamer[=1.0] Enable GStreamer support], |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
25 |
+[ MOZ_GSTREAMER=1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
26 |
+ # API version, eg 0.10, 1.0 etc |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
27 |
+ if test -n "$enableval" ]; then |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
28 |
+ GST_API_VERSION=$enableval |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
29 |
+ else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
30 |
+ GST_API_VERSION=0.10 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
31 |
+ fi] |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
32 |
+[ MOZ_GSTREAMER=]) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
33 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
34 |
if test "$MOZ_GSTREAMER"; then |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
35 |
- # API version, eg 0.10, 1.0 etc |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
36 |
- GST_API_VERSION=0.10 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
37 |
# core/base release number |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
38 |
# depend on >= 0.10.33 as that's when the playbin2 source-setup signal was |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
39 |
# introduced |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
40 |
- GST_VERSION=0.10.33 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
41 |
+ if test "$GST_API_VERSION" = "1.0"; then |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
42 |
+ GST_VERSION=1.0 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
43 |
+ else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
44 |
+ GST_VERSION=0.10.33 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
45 |
+ fi |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
46 |
PKG_CHECK_MODULES(GSTREAMER, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
47 |
gstreamer-$GST_API_VERSION >= $GST_VERSION |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
48 |
gstreamer-app-$GST_API_VERSION |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
49 |
gstreamer-plugins-base-$GST_API_VERSION) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
50 |
if test -n "$GSTREAMER_LIBS"; then |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
51 |
_SAVE_LDFLAGS=$LDFLAGS |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
52 |
LDFLAGS="$LDFLAGS $GSTREAMER_LIBS -lgstvideo-$GST_API_VERSION" |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
53 |
AC_TRY_LINK(,[return 0;],_HAVE_LIBGSTVIDEO=1,_HAVE_LIBGSTVIDEO=) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
54 |
diff --git a/content/media/gstreamer/GStreamerReader.cpp b/content/media/gstreamer/GStreamerReader.cpp |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
55 |
--- a/content/media/gstreamer/GStreamerReader.cpp |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
56 |
+++ b/content/media/gstreamer/GStreamerReader.cpp |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
57 |
@@ -69,18 +69,22 @@ GStreamerReader::GStreamerReader(Abstrac |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
58 |
MOZ_COUNT_CTOR(GStreamerReader); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
59 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
60 |
mSrcCallbacks.need_data = GStreamerReader::NeedDataCb; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
61 |
mSrcCallbacks.enough_data = GStreamerReader::EnoughDataCb; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
62 |
mSrcCallbacks.seek_data = GStreamerReader::SeekDataCb; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
63 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
64 |
mSinkCallbacks.eos = GStreamerReader::EosCb; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
65 |
mSinkCallbacks.new_preroll = GStreamerReader::NewPrerollCb; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
66 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
67 |
+ mSinkCallbacks.new_sample = GStreamerReader::NewBufferCb; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
68 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
69 |
mSinkCallbacks.new_buffer = GStreamerReader::NewBufferCb; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
70 |
mSinkCallbacks.new_buffer_list = NULL; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
71 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
72 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
73 |
gst_segment_init(&mVideoSegment, GST_FORMAT_UNDEFINED); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
74 |
gst_segment_init(&mAudioSegment, GST_FORMAT_UNDEFINED); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
75 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
76 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
77 |
GStreamerReader::~GStreamerReader() |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
78 |
{ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
79 |
MOZ_COUNT_DTOR(GStreamerReader); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
80 |
@@ -120,19 +124,26 @@ nsresult GStreamerReader::Init(MediaDeco |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
81 |
mVideoSink = gst_parse_bin_from_description("capsfilter name=filter ! " |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
82 |
"appsink name=videosink sync=true max-buffers=1 " |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
83 |
"caps=video/x-raw-yuv,format=(fourcc)I420" |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
84 |
, TRUE, NULL); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
85 |
mVideoAppSink = GST_APP_SINK(gst_bin_get_by_name(GST_BIN(mVideoSink), |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
86 |
"videosink")); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
87 |
gst_app_sink_set_callbacks(mVideoAppSink, &mSinkCallbacks, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
88 |
(gpointer) this, NULL); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
89 |
- GstPad *sinkpad = gst_element_get_pad(GST_ELEMENT(mVideoAppSink), "sink"); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
90 |
+ GstPad *sinkpad = gst_element_get_static_pad(GST_ELEMENT(mVideoAppSink), "sink"); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
91 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
92 |
+ // TODO: Figure out whether we need UPSTREAM or DOWNSTREAM, or both |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
93 |
+ gst_pad_add_probe(sinkpad, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
94 |
+ (GstPadProbeType) (GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM | GST_PAD_PROBE_TYPE_EVENT_UPSTREAM), |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
95 |
+ &GStreamerReader::EventProbeCb, this, NULL); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
96 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
97 |
gst_pad_add_event_probe(sinkpad, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
98 |
G_CALLBACK(&GStreamerReader::EventProbeCb), this); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
99 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
100 |
gst_object_unref(sinkpad); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
101 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
102 |
mAudioSink = gst_parse_bin_from_description("capsfilter name=filter ! " |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
103 |
#ifdef MOZ_SAMPLE_TYPE_FLOAT32 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
104 |
"appsink name=audiosink sync=true caps=audio/x-raw-float," |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
105 |
#ifdef IS_LITTLE_ENDIAN |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
106 |
"channels={1,2},rate=44100,width=32,endianness=1234", TRUE, NULL); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
107 |
#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
108 |
@@ -145,19 +156,25 @@ nsresult GStreamerReader::Init(MediaDeco |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
109 |
#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
110 |
"channels={1,2},rate=48000,width=16,endianness=4321", TRUE, NULL); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
111 |
#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
112 |
#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
113 |
mAudioAppSink = GST_APP_SINK(gst_bin_get_by_name(GST_BIN(mAudioSink), |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
114 |
"audiosink")); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
115 |
gst_app_sink_set_callbacks(mAudioAppSink, &mSinkCallbacks, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
116 |
(gpointer) this, NULL); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
117 |
- sinkpad = gst_element_get_pad(GST_ELEMENT(mAudioAppSink), "sink"); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
118 |
+ sinkpad = gst_element_get_static_pad(GST_ELEMENT(mAudioAppSink), "sink"); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
119 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
120 |
+ gst_pad_add_probe(sinkpad, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
121 |
+ (GstPadProbeType) (GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM | GST_PAD_PROBE_TYPE_EVENT_UPSTREAM), |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
122 |
+ &GStreamerReader::EventProbeCb, this, NULL); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
123 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
124 |
gst_pad_add_event_probe(sinkpad, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
125 |
G_CALLBACK(&GStreamerReader::EventProbeCb), this); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
126 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
127 |
gst_object_unref(sinkpad); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
128 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
129 |
g_object_set(mPlayBin, "uri", "appsrc://", |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
130 |
"video-sink", mVideoSink, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
131 |
"audio-sink", mAudioSink, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
132 |
NULL); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
133 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
134 |
g_object_connect(mPlayBin, "signal::source-setup", |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
135 |
@@ -231,17 +248,17 @@ nsresult GStreamerReader::ReadMetadata(V |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
136 |
filter = gst_bin_get_by_name(GST_BIN(mAudioSink), "filter"); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
137 |
else if (!(current_flags & GST_PLAY_FLAG_VIDEO)) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
138 |
filter = gst_bin_get_by_name(GST_BIN(mVideoSink), "filter"); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
139 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
140 |
if (filter) { |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
141 |
/* Little trick: set the target caps to "skip" so that playbin2 fails to |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
142 |
* find a decoder for the stream we want to skip. |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
143 |
*/ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
144 |
- GstCaps *filterCaps = gst_caps_new_simple ("skip", NULL); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
145 |
+ GstCaps *filterCaps = gst_caps_new_simple ("skip", NULL, NULL); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
146 |
g_object_set(filter, "caps", filterCaps, NULL); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
147 |
gst_caps_unref(filterCaps); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
148 |
gst_object_unref(filter); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
149 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
150 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
151 |
/* start the pipeline */ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
152 |
gst_element_set_state(mPlayBin, GST_STATE_PAUSED); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
153 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
154 |
@@ -284,19 +301,24 @@ nsresult GStreamerReader::ReadMetadata(V |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
155 |
gst_element_set_state(mPlayBin, GST_STATE_NULL); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
156 |
gst_message_unref(message); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
157 |
return NS_ERROR_FAILURE; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
158 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
159 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
160 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
161 |
/* report the duration */ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
162 |
gint64 duration; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
163 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
164 |
+ if (gst_element_query_duration(GST_ELEMENT(mPlayBin), |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
165 |
+ GST_FORMAT_TIME, &duration)) { |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
166 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
167 |
GstFormat format = GST_FORMAT_TIME; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
168 |
if (gst_element_query_duration(GST_ELEMENT(mPlayBin), |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
169 |
&format, &duration) && format == GST_FORMAT_TIME) { |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
170 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
171 |
ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
172 |
LOG(PR_LOG_DEBUG, ("returning duration %" GST_TIME_FORMAT, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
173 |
GST_TIME_ARGS (duration))); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
174 |
duration = GST_TIME_AS_USECONDS (duration); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
175 |
mDecoder->SetMediaDuration(duration); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
176 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
177 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
178 |
int n_video = 0, n_audio = 0; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
179 |
@@ -365,59 +387,87 @@ bool GStreamerReader::DecodeAudioData() |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
180 |
{ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
181 |
NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread."); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
182 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
183 |
if (!WaitForDecodedData(&mAudioSinkBufferCount)) { |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
184 |
mAudioQueue.Finish(); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
185 |
return false; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
186 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
187 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
188 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
189 |
+ GstSample *sample = gst_app_sink_pull_sample(mAudioAppSink); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
190 |
+ GstBuffer *buffer = gst_sample_get_buffer(sample); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
191 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
192 |
GstBuffer *buffer = gst_app_sink_pull_buffer(mAudioAppSink); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
193 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
194 |
int64_t timestamp = GST_BUFFER_TIMESTAMP(buffer); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
195 |
timestamp = gst_segment_to_stream_time(&mAudioSegment, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
196 |
GST_FORMAT_TIME, timestamp); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
197 |
timestamp = GST_TIME_AS_USECONDS(timestamp); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
198 |
int64_t duration = 0; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
199 |
if (GST_CLOCK_TIME_IS_VALID(GST_BUFFER_DURATION(buffer))) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
200 |
duration = GST_TIME_AS_USECONDS(GST_BUFFER_DURATION(buffer)); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
201 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
202 |
int64_t offset = GST_BUFFER_OFFSET(buffer); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
203 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
204 |
+ GstMapInfo info; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
205 |
+ gst_buffer_map(buffer, &info, GST_MAP_READ); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
206 |
+ unsigned int size = info.size; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
207 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
208 |
unsigned int size = GST_BUFFER_SIZE(buffer); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
209 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
210 |
int32_t frames = (size / sizeof(AudioDataValue)) / mInfo.mAudioChannels; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
211 |
ssize_t outSize = static_cast<size_t>(size / sizeof(AudioDataValue)); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
212 |
nsAutoArrayPtr<AudioDataValue> data(new AudioDataValue[outSize]); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
213 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
214 |
+ memcpy(data, info.data, info.size); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
215 |
+ gst_buffer_unmap(buffer, &info); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
216 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
217 |
memcpy(data, GST_BUFFER_DATA(buffer), GST_BUFFER_SIZE(buffer)); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
218 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
219 |
AudioData *audio = new AudioData(offset, timestamp, duration, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
220 |
frames, data.forget(), mInfo.mAudioChannels); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
221 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
222 |
mAudioQueue.Push(audio); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
223 |
gst_buffer_unref(buffer); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
224 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
225 |
return true; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
226 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
227 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
228 |
bool GStreamerReader::DecodeVideoFrame(bool &aKeyFrameSkip, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
229 |
int64_t aTimeThreshold) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
230 |
{ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
231 |
NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread."); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
232 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
233 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
234 |
+ GstSample *sample = NULL; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
235 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
236 |
GstBuffer *buffer = NULL; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
237 |
int64_t timestamp, nextTimestamp; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
238 |
while (true) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
239 |
{ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
240 |
if (!WaitForDecodedData(&mVideoSinkBufferCount)) { |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
241 |
mVideoQueue.Finish(); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
242 |
break; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
243 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
244 |
mDecoder->NotifyDecodedFrames(0, 1); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
245 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
246 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
247 |
+ sample = gst_app_sink_pull_sample(mVideoAppSink); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
248 |
+ buffer = gst_sample_get_buffer(sample); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
249 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
250 |
buffer = gst_app_sink_pull_buffer(mVideoAppSink); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
251 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
252 |
bool isKeyframe = !GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DISCONT); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
253 |
if ((aKeyFrameSkip && !isKeyframe)) { |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
254 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
255 |
+ gst_sample_unref(sample); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
256 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
257 |
gst_buffer_unref(buffer); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
258 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
259 |
buffer = NULL; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
260 |
continue; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
261 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
262 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
263 |
timestamp = GST_BUFFER_TIMESTAMP(buffer); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
264 |
{ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
265 |
ReentrantMonitorAutoEnter mon(mGstThreadsMonitor); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
266 |
timestamp = gst_segment_to_stream_time(&mVideoSegment, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
267 |
@@ -431,62 +481,90 @@ bool GStreamerReader::DecodeVideoFrame(b |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
268 |
else if (fpsNum && fpsDen) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
269 |
/* add 1-frame duration */ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
270 |
nextTimestamp += gst_util_uint64_scale(GST_USECOND, fpsNum, fpsDen); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
271 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
272 |
if (timestamp < aTimeThreshold) { |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
273 |
LOG(PR_LOG_DEBUG, ("skipping frame %" GST_TIME_FORMAT |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
274 |
" threshold %" GST_TIME_FORMAT, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
275 |
GST_TIME_ARGS(timestamp), GST_TIME_ARGS(aTimeThreshold))); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
276 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
277 |
+ gst_sample_unref(sample); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
278 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
279 |
gst_buffer_unref(buffer); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
280 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
281 |
buffer = NULL; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
282 |
continue; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
283 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
284 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
285 |
break; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
286 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
287 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
288 |
if (buffer == NULL) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
289 |
/* no more frames */ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
290 |
return false; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
291 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
292 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
293 |
+ GstMapInfo info; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
294 |
+ gst_buffer_map(buffer, &info, GST_MAP_READ); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
295 |
+ guint8 *data = info.data; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
296 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
297 |
guint8 *data = GST_BUFFER_DATA(buffer); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
298 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
299 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
300 |
int width = mPicture.width; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
301 |
int height = mPicture.height; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
302 |
GstVideoFormat format = mFormat; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
303 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
304 |
VideoData::YCbCrBuffer b; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
305 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
306 |
+ GstVideoInfo *video_info; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
307 |
+ gst_video_info_set_format(video_info, format, width, height); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
308 |
+ for(int i = 0; i < 3; i++) { |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
309 |
+ b.mPlanes[i].mData = data + GST_VIDEO_INFO_COMP_OFFSET(video_info, i); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
310 |
+ b.mPlanes[i].mStride = GST_VIDEO_INFO_COMP_STRIDE(video_info, i); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
311 |
+ b.mPlanes[i].mHeight = GST_VIDEO_INFO_COMP_HEIGHT(video_info, i); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
312 |
+ b.mPlanes[i].mWidth = GST_VIDEO_INFO_COMP_WIDTH(video_info, i); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
313 |
+ b.mPlanes[i].mOffset = 0; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
314 |
+ b.mPlanes[i].mSkip = 0; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
315 |
+ } |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
316 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
317 |
for(int i = 0; i < 3; i++) { |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
318 |
b.mPlanes[i].mData = data + gst_video_format_get_component_offset(format, i, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
319 |
width, height); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
320 |
b.mPlanes[i].mStride = gst_video_format_get_row_stride(format, i, width); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
321 |
b.mPlanes[i].mHeight = gst_video_format_get_component_height(format, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
322 |
i, height); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
323 |
b.mPlanes[i].mWidth = gst_video_format_get_component_width(format, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
324 |
i, width); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
325 |
b.mPlanes[i].mOffset = 0; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
326 |
b.mPlanes[i].mSkip = 0; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
327 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
328 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
329 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
330 |
bool isKeyframe = !GST_BUFFER_FLAG_IS_SET(buffer, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
331 |
GST_BUFFER_FLAG_DELTA_UNIT); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
332 |
/* XXX ? */ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
333 |
int64_t offset = 0; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
334 |
VideoData *video = VideoData::Create(mInfo, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
335 |
mDecoder->GetImageContainer(), |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
336 |
offset, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
337 |
timestamp, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
338 |
nextTimestamp, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
339 |
b, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
340 |
isKeyframe, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
341 |
-1, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
342 |
mPicture); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
343 |
mVideoQueue.Push(video); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
344 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
345 |
+ gst_buffer_unmap(buffer, &info); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
346 |
+ gst_sample_unref(sample); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
347 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
348 |
gst_buffer_unref(buffer); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
349 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
350 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
351 |
return true; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
352 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
353 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
354 |
nsresult GStreamerReader::Seek(int64_t aTarget, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
355 |
int64_t aStartTime, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
356 |
int64_t aEndTime, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
357 |
int64_t aCurrentTime) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
358 |
@@ -509,52 +587,62 @@ nsresult GStreamerReader::Seek(int64_t a |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
359 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
360 |
nsresult GStreamerReader::GetBuffered(nsTimeRanges* aBuffered, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
361 |
int64_t aStartTime) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
362 |
{ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
363 |
if (!mInfo.mHasVideo && !mInfo.mHasAudio) { |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
364 |
return NS_OK; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
365 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
366 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
367 |
- GstFormat format = GST_FORMAT_TIME; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
368 |
+#if GST_VERSION_MAJOR == 0 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
369 |
+ GstFormat format = GST_FORMAT_TIME; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
370 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
371 |
+ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
372 |
MediaResource* resource = mDecoder->GetResource(); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
373 |
gint64 resourceLength = resource->GetLength(); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
374 |
nsTArray<MediaByteRange> ranges; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
375 |
resource->GetCachedRanges(ranges); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
376 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
377 |
if (mDecoder->OnStateMachineThread()) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
378 |
/* Report the position from here while buffering as we can't report it from |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
379 |
* the gstreamer threads that are actually reading from the resource |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
380 |
*/ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
381 |
NotifyBytesConsumed(); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
382 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
383 |
if (resource->IsDataCachedToEndOfResource(0)) { |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
384 |
/* fast path for local or completely cached files */ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
385 |
gint64 duration = 0; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
386 |
- GstFormat format = GST_FORMAT_TIME; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
387 |
- |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
388 |
duration = QueryDuration(); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
389 |
double end = (double) duration / GST_MSECOND; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
390 |
LOG(PR_LOG_DEBUG, ("complete range [0, %f] for [0, %li]", |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
391 |
end, resourceLength)); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
392 |
aBuffered->Add(0, end); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
393 |
return NS_OK; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
394 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
395 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
396 |
for(uint32_t index = 0; index < ranges.Length(); index++) { |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
397 |
int64_t startOffset = ranges[index].mStart; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
398 |
int64_t endOffset = ranges[index].mEnd; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
399 |
gint64 startTime, endTime; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
400 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
401 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
402 |
+ if (!gst_element_query_convert(GST_ELEMENT(mPlayBin), GST_FORMAT_BYTES, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
403 |
+ startOffset, GST_FORMAT_TIME, &startTime)) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
404 |
+ continue; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
405 |
+ if (!gst_element_query_convert(GST_ELEMENT(mPlayBin), GST_FORMAT_BYTES, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
406 |
+ endOffset, GST_FORMAT_TIME, &endTime)) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
407 |
+ continue; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
408 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
409 |
if (!gst_element_query_convert(GST_ELEMENT(mPlayBin), GST_FORMAT_BYTES, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
410 |
startOffset, &format, &startTime) || format != GST_FORMAT_TIME) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
411 |
continue; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
412 |
if (!gst_element_query_convert(GST_ELEMENT(mPlayBin), GST_FORMAT_BYTES, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
413 |
endOffset, &format, &endTime) || format != GST_FORMAT_TIME) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
414 |
continue; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
415 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
416 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
417 |
double start = start = (double) GST_TIME_AS_USECONDS (startTime) / GST_MSECOND; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
418 |
double end = (double) GST_TIME_AS_USECONDS (endTime) / GST_MSECOND; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
419 |
LOG(PR_LOG_DEBUG, ("adding range [%f, %f] for [%li %li] size %li", |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
420 |
start, end, startOffset, endOffset, resourceLength)); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
421 |
aBuffered->Add(start, end); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
422 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
423 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
424 |
@@ -563,48 +651,64 @@ nsresult GStreamerReader::GetBuffered(ns |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
425 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
426 |
void GStreamerReader::ReadAndPushData(guint aLength) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
427 |
{ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
428 |
MediaResource* resource = mDecoder->GetResource(); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
429 |
NS_ASSERTION(resource, "Decoder has no media resource"); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
430 |
nsresult rv = NS_OK; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
431 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
432 |
GstBuffer *buffer = gst_buffer_new_and_alloc(aLength); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
433 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
434 |
+ GstMapInfo info; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
435 |
+ gst_buffer_map(buffer, &info, GST_MAP_WRITE); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
436 |
+ guint8 *data = info.data; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
437 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
438 |
guint8 *data = GST_BUFFER_DATA(buffer); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
439 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
440 |
uint32_t size = 0, bytesRead = 0; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
441 |
while(bytesRead < aLength) { |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
442 |
rv = resource->Read(reinterpret_cast<char*>(data + bytesRead), |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
443 |
aLength - bytesRead, &size); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
444 |
if (NS_FAILED(rv) || size == 0) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
445 |
break; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
446 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
447 |
bytesRead += size; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
448 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
449 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
450 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
451 |
+ info.size = bytesRead; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
452 |
+ gst_buffer_unmap(buffer, &info); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
453 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
454 |
GST_BUFFER_SIZE(buffer) = bytesRead; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
455 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
456 |
mByteOffset += bytesRead; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
457 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
458 |
GstFlowReturn ret = gst_app_src_push_buffer(mSource, gst_buffer_ref(buffer)); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
459 |
if (ret != GST_FLOW_OK) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
460 |
LOG(PR_LOG_ERROR, ("ReadAndPushData push ret %s", gst_flow_get_name(ret))); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
461 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
462 |
- if (GST_BUFFER_SIZE (buffer) < aLength) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
463 |
+ if (bytesRead < aLength) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
464 |
/* If we read less than what we wanted, we reached the end */ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
465 |
gst_app_src_end_of_stream(mSource); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
466 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
467 |
gst_buffer_unref(buffer); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
468 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
469 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
470 |
int64_t GStreamerReader::QueryDuration() |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
471 |
{ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
472 |
gint64 duration = 0; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
473 |
GstFormat format = GST_FORMAT_TIME; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
474 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
475 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
476 |
+ if (gst_element_query_duration(GST_ELEMENT(mPlayBin), |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
477 |
+ format, &duration)) { |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
478 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
479 |
if (gst_element_query_duration(GST_ELEMENT(mPlayBin), |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
480 |
&format, &duration)) { |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
481 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
482 |
if (format == GST_FORMAT_TIME) { |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
483 |
LOG(PR_LOG_DEBUG, ("pipeline duration %" GST_TIME_FORMAT, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
484 |
GST_TIME_ARGS (duration))); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
485 |
duration = GST_TIME_AS_USECONDS (duration); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
486 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
487 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
488 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
489 |
/*if (mDecoder->mDuration != -1 && |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
490 |
@@ -668,60 +772,95 @@ gboolean GStreamerReader::SeekData(GstAp |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
491 |
if (NS_SUCCEEDED(rv)) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
492 |
mByteOffset = mLastReportedByteOffset = aOffset; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
493 |
else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
494 |
LOG(PR_LOG_ERROR, ("seek at %lu failed", aOffset)); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
495 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
496 |
return NS_SUCCEEDED(rv); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
497 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
498 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
499 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
500 |
+GstPadProbeReturn GStreamerReader::EventProbeCb(GstPad *aPad, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
501 |
+ GstPadProbeInfo *aInfo, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
502 |
+ gpointer aUserData) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
503 |
+{ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
504 |
+ GStreamerReader *reader = (GStreamerReader *) aUserData; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
505 |
+ GstEvent *aEvent = (GstEvent *)aInfo->data; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
506 |
+ return reader->EventProbe(aPad, aEvent); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
507 |
+} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
508 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
509 |
gboolean GStreamerReader::EventProbeCb(GstPad *aPad, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
510 |
GstEvent *aEvent, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
511 |
gpointer aUserData) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
512 |
{ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
513 |
GStreamerReader *reader = (GStreamerReader *) aUserData; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
514 |
return reader->EventProbe(aPad, aEvent); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
515 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
516 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
517 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
518 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
519 |
+GstPadProbeReturn GStreamerReader::EventProbe(GstPad *aPad, GstEvent *aEvent) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
520 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
521 |
gboolean GStreamerReader::EventProbe(GstPad *aPad, GstEvent *aEvent) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
522 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
523 |
{ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
524 |
GstElement *parent = GST_ELEMENT(gst_pad_get_parent(aPad)); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
525 |
switch(GST_EVENT_TYPE(aEvent)) { |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
526 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
527 |
+ case GST_EVENT_SEGMENT: |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
528 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
529 |
case GST_EVENT_NEWSEGMENT: |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
530 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
531 |
{ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
532 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
533 |
+ const GstSegment *newSegment; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
534 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
535 |
gboolean update; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
536 |
gdouble rate; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
537 |
GstFormat format; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
538 |
gint64 start, stop, position; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
539 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
540 |
GstSegment *segment; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
541 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
542 |
/* Store the segments so we can convert timestamps to stream time, which |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
543 |
* is what the upper layers sync on. |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
544 |
*/ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
545 |
ReentrantMonitorAutoEnter mon(mGstThreadsMonitor); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
546 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
547 |
+ gst_event_parse_segment(aEvent, &newSegment); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
548 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
549 |
gst_event_parse_new_segment(aEvent, &update, &rate, &format, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
550 |
&start, &stop, &position); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
551 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
552 |
if (parent == GST_ELEMENT(mVideoAppSink)) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
553 |
segment = &mVideoSegment; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
554 |
else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
555 |
segment = &mAudioSegment; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
556 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
557 |
+ gst_segment_copy_into (newSegment, segment); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
558 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
559 |
gst_segment_set_newsegment(segment, update, rate, format, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
560 |
start, stop, position); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
561 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
562 |
break; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
563 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
564 |
case GST_EVENT_FLUSH_STOP: |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
565 |
/* Reset on seeks */ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
566 |
ResetDecode(); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
567 |
break; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
568 |
default: |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
569 |
break; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
570 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
571 |
gst_object_unref(parent); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
572 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
573 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
574 |
+ return GST_PAD_PROBE_OK; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
575 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
576 |
return TRUE; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
577 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
578 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
579 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
580 |
GstFlowReturn GStreamerReader::NewPrerollCb(GstAppSink *aSink, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
581 |
gpointer aUserData) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
582 |
{ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
583 |
GStreamerReader *reader = (GStreamerReader *) aUserData; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
584 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
585 |
if (aSink == reader->mVideoAppSink) |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
586 |
@@ -730,18 +869,22 @@ GstFlowReturn GStreamerReader::NewPrerol |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
587 |
reader->AudioPreroll(); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
588 |
return GST_FLOW_OK; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
589 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
590 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
591 |
void GStreamerReader::AudioPreroll() |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
592 |
{ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
593 |
/* The first audio buffer has reached the audio sink. Get rate and channels */ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
594 |
LOG(PR_LOG_DEBUG, ("Audio preroll")); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
595 |
- GstPad *sinkpad = gst_element_get_pad(GST_ELEMENT(mAudioAppSink), "sink"); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
596 |
+ GstPad *sinkpad = gst_element_get_static_pad(GST_ELEMENT(mAudioAppSink), "sink"); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
597 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
598 |
+ GstCaps *caps = gst_pad_get_current_caps(sinkpad); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
599 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
600 |
GstCaps *caps = gst_pad_get_negotiated_caps(sinkpad); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
601 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
602 |
GstStructure *s = gst_caps_get_structure(caps, 0); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
603 |
mInfo.mAudioRate = mInfo.mAudioChannels = 0; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
604 |
gst_structure_get_int(s, "rate", (gint *) &mInfo.mAudioRate); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
605 |
gst_structure_get_int(s, "channels", (gint *) &mInfo.mAudioChannels); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
606 |
NS_ASSERTION(mInfo.mAudioRate != 0, ("audio rate is zero")); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
607 |
NS_ASSERTION(mInfo.mAudioChannels != 0, ("audio channels is zero")); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
608 |
NS_ASSERTION(mInfo.mAudioChannels > 0 && mInfo.mAudioChannels <= MAX_CHANNELS, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
609 |
"invalid audio channels number"); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
610 |
@@ -749,19 +892,29 @@ void GStreamerReader::AudioPreroll() |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
611 |
gst_caps_unref(caps); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
612 |
gst_object_unref(sinkpad); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
613 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
614 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
615 |
void GStreamerReader::VideoPreroll() |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
616 |
{ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
617 |
/* The first video buffer has reached the video sink. Get width and height */ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
618 |
LOG(PR_LOG_DEBUG, ("Video preroll")); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
619 |
- GstPad *sinkpad = gst_element_get_pad(GST_ELEMENT(mVideoAppSink), "sink"); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
620 |
+ GstPad *sinkpad = gst_element_get_static_pad(GST_ELEMENT(mVideoAppSink), "sink"); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
621 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
622 |
+ GstCaps *caps = gst_pad_get_current_caps(sinkpad); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
623 |
+ GstVideoInfo info; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
624 |
+ memset (&info, 0, sizeof (info)); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
625 |
+ gst_video_info_from_caps(&info, caps); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
626 |
+ mFormat = info.finfo->format; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
627 |
+ mPicture.width = info.width; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
628 |
+ mPicture.height = info.height; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
629 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
630 |
GstCaps *caps = gst_pad_get_negotiated_caps(sinkpad); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
631 |
gst_video_format_parse_caps(caps, &mFormat, &mPicture.width, &mPicture.height); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
632 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
633 |
GstStructure *structure = gst_caps_get_structure(caps, 0); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
634 |
gst_structure_get_fraction(structure, "framerate", &fpsNum, &fpsDen); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
635 |
NS_ASSERTION(mPicture.width && mPicture.height, "invalid video resolution"); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
636 |
mInfo.mDisplay = nsIntSize(mPicture.width, mPicture.height); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
637 |
mInfo.mHasVideo = true; |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
638 |
gst_caps_unref(caps); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
639 |
gst_object_unref(sinkpad); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
640 |
} |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
641 |
diff --git a/content/media/gstreamer/GStreamerReader.h b/content/media/gstreamer/GStreamerReader.h |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
642 |
--- a/content/media/gstreamer/GStreamerReader.h |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
643 |
+++ b/content/media/gstreamer/GStreamerReader.h |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
644 |
@@ -71,18 +71,23 @@ private: |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
645 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
646 |
/* Called when a seek is issued on the pipeline */ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
647 |
static gboolean SeekDataCb(GstAppSrc *aSrc, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
648 |
guint64 aOffset, |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
649 |
gpointer aUserData); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
650 |
gboolean SeekData(GstAppSrc *aSrc, guint64 aOffset); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
651 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
652 |
/* Called when events reach the sinks. See inline comments */ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
653 |
+#if GST_VERSION_MAJOR == 1 |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
654 |
+ static GstPadProbeReturn EventProbeCb(GstPad *aPad, GstPadProbeInfo *aInfo, gpointer aUserData); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
655 |
+ GstPadProbeReturn EventProbe(GstPad *aPad, GstEvent *aEvent); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
656 |
+#else |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
657 |
static gboolean EventProbeCb(GstPad *aPad, GstEvent *aEvent, gpointer aUserData); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
658 |
gboolean EventProbe(GstPad *aPad, GstEvent *aEvent); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
659 |
+#endif |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
660 |
|
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
661 |
/* Called when the pipeline is prerolled, that is when at start or after a |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
662 |
* seek, the first audio and video buffers are queued in the sinks. |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
663 |
*/ |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
664 |
static GstFlowReturn NewPrerollCb(GstAppSink *aSink, gpointer aUserData); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
665 |
void VideoPreroll(); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
666 |
void AudioPreroll(); |
9f6e14430916
Bug 806917 - support GStreamer 1.0
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
667 |