[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:gst-droid.spec
^
|
|
[-]
[+]
|
Changed |
_service
^
|
@@ -1,6 +1,6 @@
<services>
<service name="tar_git">
<param name="url">https://github.com/sailfishos/gst-droid.git</param>
- <param name="branch">nocodec</param>
+ <param name="branch">master</param>
</service>
</services>
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/Makefile.am
^
|
@@ -5,4 +5,4 @@
gstreamer-droid-1.0.pc
pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = gstreamer-droid-1.0.pc
\ No newline at end of file
+pkgconfig_DATA = gstreamer-droid-1.0.pc
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/configure.ac
^
|
@@ -167,7 +167,7 @@
[GStreamer API Version])
AC_CONFIG_FILES([Makefile
- gstreamer-droid-1.0.pc
+ gstreamer-droid-1.0.pc
common/Makefile
common/m4/Makefile
gst-libs/Makefile
@@ -175,6 +175,7 @@
gst-libs/gst/droid/Makefile
gst/Makefile
gst/droideglsink/Makefile
+ gst/droidcodec/Makefile
gst/droidcamsrc/Makefile
tools/Makefile])
AC_OUTPUT
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst-libs/gst/droid/Makefile.am
^
|
@@ -16,10 +16,12 @@
gstdroidmediabuffer.c \
gstdroidbufferpool.c \
gstdroidquery.c \
+ gstdroidcodec.c \
/usr/share/droidmedia/hybris.c
libgstdroid_@GST_API_VERSION@_la_include_HEADERS = \
gstwrappedmemory.h \
gstdroidmediabuffer.h \
gstdroidbufferpool.h \
- gstdroidquery.h
\ No newline at end of file
+ gstdroidquery.h \
+ gstdroidcodec.h
\ No newline at end of file
|
[-]
[+]
|
Added |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst-libs/gst/droid/gstdroidcodec.c
^
|
@@ -0,0 +1,1123 @@
+/*
+ * gst-droid
+ *
+ * Copyright (C) 2014-2015 Mohammed Sameer <msameer@foolab.org>
+ * Copyright (C) 2015 Jolla LTD.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gstdroidcodec.h"
+#include <glib.h>
+#include <gst/base/gstbytewriter.h>
+#ifndef GST_USE_UNSTABLE_API
+#define GST_USE_UNSTABLE_API
+#endif /* GST_USE_UNSTABLE_API */
+#include <gst/codecparsers/gsth264parser.h>
+
+GST_DEBUG_CATEGORY (gst_droid_codec_debug);
+#define GST_CAT_DEFAULT gst_droid_codec_debug
+
+static GstBuffer *create_mpeg4venc_codec_data (DroidMediaData * data);
+static GstBuffer *create_h264enc_codec_data (DroidMediaData * data);
+static gboolean create_mpeg4vdec_codec_data_from_codec_data (GstDroidCodec *
+ codec, GstBuffer * data, DroidMediaData * out);
+static gboolean create_h264dec_codec_data_from_codec_data (GstDroidCodec *
+ codec, GstBuffer * data, DroidMediaData * out);
+static gboolean create_vp8vdec_codec_data_from_codec_data (GstDroidCodec *
+ codec, GstBuffer * data, DroidMediaData * out);
+static gboolean create_aacdec_codec_data_from_codec_data (GstDroidCodec * codec,
+ GstBuffer * data, DroidMediaData * out);
+static gboolean create_aacdec_codec_data_from_frame_data (GstDroidCodec * codec,
+ GstBuffer * frame_data, DroidMediaData * out);
+static gboolean process_h264dec_data (GstDroidCodec * codec, GstBuffer * buffer,
+ DroidMediaData * out);
+static gboolean process_aacdec_data (GstDroidCodec * codec, GstBuffer * buffer,
+ DroidMediaData * out);
+static gboolean is_mpeg4v (GstDroidCodec * codec, const GstStructure * s);
+static gboolean is_mpega (GstDroidCodec * codec, const GstStructure * s);
+static gboolean is_mp3 (GstDroidCodec * codec, const GstStructure * s);
+static gboolean is_h264_dec (GstDroidCodec * codec, const GstStructure * s);
+static gboolean is_h264_enc (GstDroidCodec * codec, const GstStructure * s);
+static void h264enc_complement (GstCaps * caps);
+static gboolean process_h264enc_data (DroidMediaData * in,
+ DroidMediaData * out);
+static void gst_droid_codec_release_input_frame (void *data);
+static void gst_droid_codec_free (GstDroidCodec * codec);
+static void gst_droid_codec_type_fill_quirks (GstDroidCodec * codec);
+
+GST_DEFINE_MINI_OBJECT_TYPE (GstDroidCodec, gst_droid_codec);
+
+typedef struct
+{
+ gpointer data;
+} GstDroidCodecFrameReleaseData;
+
+struct _GstDroidCodecPrivate
+{
+ guint h264_nal;
+ gboolean aac_adts;
+};
+
+struct _GstDroidCodecInfo
+{
+ GstDroidCodecType type;
+ const gchar *mime;
+ const gchar *droid;
+ const gchar *caps;
+ gboolean enabled;
+
+ gboolean (*validate_structure) (GstDroidCodec * codec,
+ const GstStructure * s);
+ void (*complement_caps) (GstCaps * caps);
+ GstBuffer *(*create_encoder_codec_data) (DroidMediaData * data);
+ gboolean (*process_encoder_data) (DroidMediaData * in,
+ DroidMediaData * out);
+ gboolean (*create_decoder_codec_data_from_codec_data) (GstDroidCodec *
+ codec, GstBuffer * codec_data, DroidMediaData * out);
+ gboolean (*create_decoder_codec_data_from_frame_data) (GstDroidCodec *
+ codec, GstBuffer * frame_data, DroidMediaData * out);
+ gboolean (*process_decoder_data) (GstDroidCodec * codec, GstBuffer * buffer,
+ DroidMediaData * out);
+};
+
+/* codecs */
+#define CAPS_FRAGMENT_AUDIO_ENCODER \
+ " , channels = (int) [1, 2]"
+
+static GstDroidCodecInfo codecs[] = {
+ /* audio decoders */
+ {GST_DROID_CODEC_DECODER_AUDIO, "audio/mpeg", "audio/mp4a-latm",
+ "audio/mpeg, mpegversion=(int){2, 4}, stream-format=(string){raw, adts}",
+ TRUE,
+ is_mpega, NULL, NULL, NULL, create_aacdec_codec_data_from_codec_data,
+ create_aacdec_codec_data_from_frame_data, process_aacdec_data},
+
+ {GST_DROID_CODEC_DECODER_AUDIO, "audio/mpeg", "audio/mpeg",
+ "audio/mpeg, mpegversion=(int)1, layer=[1, 3]", TRUE,
+ is_mp3, NULL, NULL, NULL, NULL, NULL, NULL},
+
+ /* video decoders */
+ {GST_DROID_CODEC_DECODER_VIDEO, "video/mpeg", "video/mp4v-es",
+ "video/mpeg, mpegversion=4", TRUE,
+ is_mpeg4v, NULL, NULL, NULL,
+ create_mpeg4vdec_codec_data_from_codec_data, NULL, NULL},
+
+ {GST_DROID_CODEC_DECODER_VIDEO, "video/x-h264", "video/avc",
+ "video/x-h264, stream-format=avc,alignment=au", TRUE,
+ is_h264_dec, NULL, NULL, NULL,
+ create_h264dec_codec_data_from_codec_data, NULL, process_h264dec_data},
+
+ {GST_DROID_CODEC_DECODER_VIDEO, "video/x-h263", "video/3gpp",
+ "video/x-h263", TRUE, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL},
+
+ {GST_DROID_CODEC_DECODER_VIDEO, "video/x-vp8", "video/x-vnd.on2.vp8",
+ "video/x-vp8", TRUE, NULL, NULL, NULL, NULL,
+ create_vp8vdec_codec_data_from_codec_data, NULL, NULL},
+
+ /* audio encoders */
+ {GST_DROID_CODEC_ENCODER_AUDIO, "audio/mpeg", "audio/mp4a-latm",
+ "audio/mpeg, mpegversion=(int)4, stream-format=(string){raw}"
+ CAPS_FRAGMENT_AUDIO_ENCODER, TRUE,
+ is_mpeg4v, NULL, create_mpeg4venc_codec_data, NULL, NULL, NULL, NULL},
+
+ /* video encoders */
+ {GST_DROID_CODEC_ENCODER_VIDEO, "video/mpeg", "video/mp4v-es",
+ "video/mpeg, mpegversion=4, systemstream=false", TRUE,
+ is_mpeg4v, NULL, create_mpeg4venc_codec_data, NULL, NULL, NULL, NULL},
+
+ {GST_DROID_CODEC_ENCODER_VIDEO, "video/x-h264", "video/avc",
+ "video/x-h264, stream-format=avc,alignment=au", TRUE,
+ is_h264_enc, h264enc_complement, create_h264enc_codec_data,
+ process_h264enc_data, NULL, NULL, NULL},
+};
+
+GstDroidCodec *
+gst_droid_codec_new_from_caps (GstCaps * caps, GstDroidCodecType type)
+{
+ int x = 0;
+ int len = G_N_ELEMENTS (codecs);
+ GstStructure *s = gst_caps_get_structure (caps, 0);
+ const gchar *name = gst_structure_get_name (s);
+ GstDroidCodec *codec = g_slice_new (GstDroidCodec);
+ codec->data = g_slice_new0 (GstDroidCodecPrivate);
+
+ for (x = 0; x < len; x++) {
+ if (codecs[x].type != type) {
+ continue;
+ }
+
+ gboolean is_equal = g_strcmp0 (codecs[x].mime, name) == 0;
+ if (!is_equal) {
+ continue;
+ }
+
+ if (!codecs[x].validate_structure
+ || codecs[x].validate_structure (codec, s)) {
+ gst_mini_object_init (GST_MINI_OBJECT_CAST (codec), 0,
+ gst_droid_codec_get_type (), NULL, NULL,
+ (GstMiniObjectFreeFunction) gst_droid_codec_free);
+
+ codec->info = &codecs[x];
+
+ /* Fill codec quirks */
+ gst_droid_codec_type_fill_quirks (codec);
+
+ return codec;
+ }
+ }
+
+ gst_droid_codec_free (codec);
+
+ return NULL;
+}
+
+GstCaps *
+gst_droid_codec_get_all_caps (GstDroidCodecType type)
+{
+ GstCaps *caps = gst_caps_new_empty ();
+ int x = 0;
+ int len = G_N_ELEMENTS (codecs);
+ GKeyFile *file = g_key_file_new ();
+ gchar *path = g_strdup_printf ("%s/gst-droid/gstdroidcodec.conf", SYSCONFDIR);
|
[-]
[+]
|
Added |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst-libs/gst/droid/gstdroidcodec.h
^
|
@@ -0,0 +1,106 @@
+/*
+ * gst-droid
+ *
+ * Copyright (C) 2014-2015 Mohammed Sameer <msameer@foolab.org>
+ * Copyright (C) 2015 Jolla LTD.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef __GST_DROID_CODEC_H__
+#define __GST_DROID_CODEC_H__
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+#include "droidmediacodec.h"
+
+G_BEGIN_DECLS
+
+/* quirks */
+#define USE_CODEC_SUPPLIED_HEIGHT_NAME "use-codec-supplied-height"
+#define USE_CODEC_SUPPLIED_HEIGHT_VALUE 0x1
+
+#define USE_CODEC_SUPPLIED_WIDTH_NAME "use-codec-supplied-width"
+#define USE_CODEC_SUPPLIED_WIDTH_VALUE 0x2
+
+typedef struct _GstDroidCodec GstDroidCodec;
+typedef struct _GstDroidCodecInfo GstDroidCodecInfo;
+typedef struct _GstDroidCodecPrivate GstDroidCodecPrivate;
+typedef enum _GstDroidCodecType GstDroidCodecType;
+typedef enum _GstDroidCodecCodecDataResult GstDroidCodecCodecDataResult;
+
+enum _GstDroidCodecType
+{
+ GST_DROID_CODEC_DECODER_AUDIO,
+ GST_DROID_CODEC_ENCODER_AUDIO,
+ GST_DROID_CODEC_DECODER_VIDEO,
+ GST_DROID_CODEC_ENCODER_VIDEO,
+};
+
+enum _GstDroidCodecCodecDataResult
+{
+ GST_DROID_CODEC_CODEC_DATA_OK,
+ GST_DROID_CODEC_CODEC_DATA_NOT_NEEDED,
+ GST_DROID_CODEC_CODEC_DATA_ERROR,
+};
+
+struct _GstDroidCodec {
+ GstMiniObject parent;
+
+ GstDroidCodecInfo *info;
+
+ GstDroidCodecPrivate *data;
+
+ gint quirks;
+};
+
+GType gst_droid_codec_get_type (void);
+
+static inline GstDroidCodec *gst_droid_codec_ref (GstDroidCodec * codec)
+{
+ return (GstDroidCodec *) gst_mini_object_ref (GST_MINI_OBJECT_CAST (codec));
+}
+
+static inline void gst_droid_codec_unref (GstDroidCodec * codec)
+{
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (codec));
+}
+
+GstDroidCodec *gst_droid_codec_new_from_caps (GstCaps * caps, GstDroidCodecType type);
+
+GstCaps *gst_droid_codec_get_all_caps (GstDroidCodecType type);
+const gchar *gst_droid_codec_get_droid_type (GstDroidCodec * codec);
+
+void gst_droid_codec_complement_caps (GstDroidCodec *codec, GstCaps * caps);
+GstBuffer *gst_droid_codec_create_encoder_codec_data (GstDroidCodec *codec, DroidMediaData *data);
+
+GstDroidCodecCodecDataResult gst_droid_codec_create_decoder_codec_data (GstDroidCodec *codec,
+ GstBuffer *data,
+ DroidMediaData *out,
+ GstBuffer *frame_data);
+
+gboolean gst_droid_codec_prepare_decoder_frame (GstDroidCodec * codec, GstVideoCodecFrame * frame,
+ DroidMediaData * data,
+ DroidMediaBufferCallbacks *cb);
+
+GstBuffer *gst_droid_codec_prepare_encoded_data (GstDroidCodec * codec, DroidMediaData * in);
+
+gboolean gst_droid_codec_process_decoder_data (GstDroidCodec * codec, GstBuffer * buffer,
+ DroidMediaData * out);
+gint gst_droid_codec_get_samples_per_frane (GstCaps * caps);
+
+G_END_DECLS
+
+#endif /* __GST_DROID_CODEC_H__ */
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst/Makefile.am
^
|
@@ -1,6 +1,6 @@
AM_CPPFLAGS = -DSYSCONFDIR=\"$(sysconfdir)\"
-SUBDIRS = droideglsink droidcamsrc
+SUBDIRS = droideglsink droidcodec droidcamsrc
plugin_LTLIBRARIES = libgstdroid.la
@@ -9,7 +9,8 @@
-I$(top_builddir)/gst-libs/ \
-I/usr/include/droidmedia/ \
-Idroidcamsrc/ \
- -Idroideglsink/
+ -Idroideglsink/ \
+ -Idroidcodec/
libgstdroid_la_LIBADD = $(GST_LIBS) $(NGI_LIBS) $(EGL_LIBS) \
$(NGM_LIBS) \
@@ -17,7 +18,8 @@
-lgstbasecamerabinsrc-1.0 \
-lgstphotography-1.0 \
droideglsink/libgstdroideglsink.la \
- droidcamsrc/libgstdroidcamsrc.la
+ droidcamsrc/libgstdroidcamsrc.la \
+ droidcodec/libgstdroidcodec.la
libgstdroid_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst/droidcamsrc/Makefile.am
^
|
@@ -19,7 +19,8 @@
gstdroidcamsrcphotography.c \
gstdroidcamsrcquirks.c \
gstdroidcamsrcexif.c \
- gstdroidcamsrcmode.c
+ gstdroidcamsrcmode.c \
+ gstdroidcamsrcrecorder.c
noinst_HEADERS = \
gstdroidcamsrc.h \
@@ -29,4 +30,5 @@
gstdroidcamsrcphotography.h \
gstdroidcamsrcquirks.h \
gstdroidcamsrcexif.h \
- gstdroidcamsrcmode.h
+ gstdroidcamsrcmode.h \
+ gstdroidcamsrcrecorder.h
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst/droidcamsrc/gstdroidcamsrc.c
^
|
@@ -30,7 +30,9 @@
#include "gst/droid/gstdroidmediabuffer.h"
#include "gst/droid/gstwrappedmemory.h"
#include "gst/droid/gstdroidquery.h"
+#include "gst/droid/gstdroidcodec.h"
#include "gstdroidcamsrcphotography.h"
+#include "gstdroidcamsrcrecorder.h"
#include "droidmediacamera.h"
#ifndef GST_USE_UNSTABLE_API
#define GST_USE_UNSTABLE_API
@@ -937,11 +939,14 @@
gst_element_class_add_pad_template (gstelement_class,
gst_static_pad_template_get (&img_src_template_factory));
+ /* encoded caps */
+ caps = gst_droid_codec_get_all_caps (GST_DROID_CODEC_ENCODER_VIDEO);
+
/* add raw caps */
caps =
+ gst_caps_merge (caps,
gst_caps_from_string (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
- (GST_CAPS_FEATURE_MEMORY_DROID_VIDEO_META_DATA, "{YV12}"));
-
+ (GST_CAPS_FEATURE_MEMORY_DROID_VIDEO_META_DATA, "{YV12}")));
tpl =
gst_pad_template_new (GST_BASE_CAMERA_SRC_VIDEO_PAD_NAME, GST_PAD_SRC,
GST_PAD_ALWAYS, caps);
@@ -1725,6 +1730,16 @@
ret = TRUE;
+ if (info.finfo->format == GST_VIDEO_FORMAT_ENCODED) {
+ GST_INFO_OBJECT (src, "using external recorder");
+ src->dev->use_recorder = TRUE;
+ } else {
+ GST_INFO_OBJECT (src, "using raw recorder");
+ src->dev->use_recorder = FALSE;
+ }
+
+ gst_droidcamsrc_recorder_update_vid (src->dev->recorder, &info, our_caps);
+
out:
if (peer) {
gst_caps_unref (peer);
@@ -2335,15 +2350,24 @@
GstCaps *tpl = gst_droidcamsrc_params_get_video_caps (src->dev->params);
GstCaps *caps = gst_caps_new_empty ();
+ GstCaps *encoded =
+ gst_droid_codec_get_all_caps (GST_DROID_CODEC_ENCODER_VIDEO);
int x;
struct Data data;
data.result = caps;
+ for (x = 0; x < gst_caps_get_size (encoded); x++) {
+ data.encoded = gst_caps_get_structure (encoded, x);
+ gst_caps_foreach (tpl, __map, &data);
+ }
+
caps = gst_caps_merge (caps, tpl);
caps = gst_caps_simplify (caps);
+ gst_caps_unref (encoded);
+
GST_DEBUG_OBJECT (src, "video caps %" GST_PTR_FORMAT, caps);
return caps;
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst/droidcamsrc/gstdroidcamsrcdev.c
^
|
@@ -26,6 +26,7 @@
#include "gstdroidcamsrcdev.h"
#include <stdlib.h>
#include "gstdroidcamsrc.h"
+#include "gstdroidcamsrcrecorder.h"
#include "gst/droid/gstdroidmediabuffer.h"
#include "gst/droid/gstwrappedmemory.h"
#include "gst/droid/gstdroidbufferpool.h"
@@ -74,6 +75,9 @@
gst_droidcamsrc_dev_prepare_buffer (GstDroidCamSrcDev * dev, GstBuffer * buffer,
DroidMediaRect rect, int width, int height, GstVideoFormat format);
static gboolean
+gst_droidcamsrc_dev_start_video_recording_recorder_locked (GstDroidCamSrcDev *
+ dev);
+static gboolean
gst_droidcamsrc_dev_start_video_recording_raw_locked (GstDroidCamSrcDev * dev);
static void gst_droidcamsrc_dev_queue_video_buffer_locked (GstDroidCamSrcDev *
dev, GstBuffer * buffer);
@@ -532,6 +536,9 @@
dev->pool = gst_droid_buffer_pool_new ();
+ dev->use_recorder = FALSE;
+ dev->recorder = gst_droidcamsrc_recorder_create (vidsrc);
+
droid_media_camera_constants_init (&dev->c);
return dev;
@@ -613,6 +620,8 @@
gst_object_unref (dev->pool);
+ gst_droidcamsrc_recorder_destroy (dev->recorder);
+
g_slice_free (GstDroidCamSrcImageCaptureState, dev->img);
g_slice_free (GstDroidCamSrcVideoCaptureState, dev->vid);
g_slice_free (GstDroidCamSrcDev, dev);
@@ -862,7 +871,11 @@
dev->vid->video_frames = 0;
dev->vid->queued_frames = 0;
- ret = gst_droidcamsrc_dev_start_video_recording_raw_locked (dev);
+ if (dev->use_recorder) {
+ ret = gst_droidcamsrc_dev_start_video_recording_recorder_locked (dev);
+ } else {
+ ret = gst_droidcamsrc_dev_start_video_recording_raw_locked (dev);
+ }
if (!ret)
goto out;
@@ -912,22 +925,28 @@
GST_ERROR ("failed to push EOS event");
}
- g_rec_mutex_lock (dev->lock);
+ if (!dev->use_recorder) {
+ g_rec_mutex_lock (dev->lock);
- GST_INFO ("waiting for queued frames %i", dev->vid->queued_frames);
+ GST_INFO ("waiting for queued frames %i", dev->vid->queued_frames);
- while (dev->vid->queued_frames > 0) {
- GST_INFO ("waiting for queued frames to reach 0 from %i",
- dev->vid->queued_frames);
+ while (dev->vid->queued_frames > 0) {
+ GST_INFO ("waiting for queued frames to reach 0 from %i",
+ dev->vid->queued_frames);
+ g_rec_mutex_unlock (dev->lock);
+ usleep (VIDEO_RECORDING_STOP_TIMEOUT);
+ g_rec_mutex_lock (dev->lock);
+ }
+
+ /* TODO: move this unlock() call after we stop recording? */
g_rec_mutex_unlock (dev->lock);
- usleep (VIDEO_RECORDING_STOP_TIMEOUT);
- g_rec_mutex_lock (dev->lock);
}
- /* TODO: move this unlock() call after we stop recording? */
- g_rec_mutex_unlock (dev->lock);
-
- droid_media_camera_stop_recording (dev->cam);
+ if (dev->use_recorder) {
+ gst_droidcamsrc_recorder_stop (dev->recorder);
+ } else {
+ droid_media_camera_stop_recording (dev->cam);
+ }
gst_buffer_pool_set_flushing (dev->pool, FALSE);
@@ -1122,6 +1141,28 @@
}
static gboolean
+gst_droidcamsrc_dev_start_video_recording_recorder_locked (GstDroidCamSrcDev *
+ dev)
+{
+ GstDroidCamSrc *src = GST_DROIDCAMSRC (GST_PAD_PARENT (dev->imgsrc->pad));
+
+ if (!gst_droidcamsrc_recorder_init (dev->recorder, dev->cam,
+ src->target_bitrate)) {
+ GST_ELEMENT_ERROR (src, LIBRARY, FAILED,
+ ("error initializing video recorder"), (NULL));
+ return FALSE;
+ }
+
+ if (!gst_droidcamsrc_recorder_start (dev->recorder)) {
+ GST_ELEMENT_ERROR (src, LIBRARY, FAILED, ("error starting video recorder"),
+ (NULL));
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static gboolean
gst_droidcamsrc_dev_start_video_recording_raw_locked (GstDroidCamSrcDev * dev)
{
GstDroidCamSrc *src = GST_DROIDCAMSRC (GST_PAD_PARENT (dev->imgsrc->pad));
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst/droidcamsrc/gstdroidcamsrcdev.h
^
|
@@ -34,6 +34,7 @@
typedef struct _GstDroidCamSrcVideoCaptureState GstDroidCamSrcVideoCaptureState;
typedef struct _GstDroidCamSrcCamInfo GstDroidCamSrcCamInfo;
typedef struct _GstDroidCamSrcPad GstDroidCamSrcPad;
+typedef struct _GstDroidCamSrcRecorder GstDroidCamSrcRecorder;
struct _GstDroidCamSrcDev
{
@@ -54,6 +55,8 @@
GstBufferPool *pool;
DroidMediaCameraConstants c;
+ gboolean use_recorder;
+ GstDroidCamSrcRecorder *recorder;
};
GstDroidCamSrcDev *gst_droidcamsrc_dev_new (GstDroidCamSrcPad *vfsrc,
|
[-]
[+]
|
Added |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst/droidcamsrc/gstdroidcamsrcrecorder.c
^
|
@@ -0,0 +1,173 @@
+/*
+ * gst-droid
+ *
+ * Copyright (C) 2016 Jolla LTD.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "gstdroidcamsrcrecorder.h"
+#include "gstdroidcamsrc.h"
+#include <gst/droid/gstdroidcodec.h>
+
+#define GST_DROIDCAMSRC_RECORDER_TARGET_BITRATE_DEFAULT 192000
+
+static void gst_droidcamsrc_recorder_data_available (void *data,
+ DroidMediaCodecData * encoded);
+
+GstDroidCamSrcRecorder *
+gst_droidcamsrc_recorder_create (GstDroidCamSrcPad * vidsrc)
+{
+ GstDroidCamSrcRecorder *recorder = g_new0 (GstDroidCamSrcRecorder, 1);
+
+ recorder->vidsrc = vidsrc;
+ recorder->md.bitrate = GST_DROIDCAMSRC_RECORDER_TARGET_BITRATE_DEFAULT;
+ recorder->md.meta_data = true;
+ recorder->md.parent.flags = DROID_MEDIA_CODEC_HW_ONLY;
+
+ return recorder;
+}
+
+void
+gst_droidcamsrc_recorder_destroy (GstDroidCamSrcRecorder * recorder)
+{
+ if (recorder->codec) {
+ gst_droid_codec_unref (recorder->codec);
+ }
+
+ g_free (recorder);
+}
+
+gboolean
+gst_droidcamsrc_recorder_init (GstDroidCamSrcRecorder * recorder,
+ DroidMediaCamera * cam, gint32 target_bitrate)
+{
+ if (!recorder->codec) {
+ return FALSE;
+ }
+
+ if (recorder->recorder) {
+ droid_media_recorder_destroy (recorder->recorder);
+ }
+
+ recorder->md.bitrate = target_bitrate;
+
+ recorder->recorder = droid_media_recorder_create (cam, &recorder->md);
+
+ if (!recorder->recorder) {
+ return FALSE;
+ }
+
+ DroidMediaCodecDataCallbacks cb;
+ cb.data_available = gst_droidcamsrc_recorder_data_available;
+
+ droid_media_recorder_set_data_callbacks (recorder->recorder, &cb, recorder);
+
+ return TRUE;
+}
+
+void
+gst_droidcamsrc_recorder_update_vid (GstDroidCamSrcRecorder * recorder,
+ GstVideoInfo * info, GstCaps * caps)
+{
+ recorder->codec =
+ gst_droid_codec_new_from_caps (caps, GST_DROID_CODEC_ENCODER_VIDEO);
+ recorder->md.parent.width = info->width;
+ recorder->md.parent.height = info->height;
+ recorder->md.stride = recorder->md.parent.width;
+ recorder->md.slice_height = recorder->md.parent.height;
+ recorder->md.parent.fps = info->fps_n / info->fps_d;
+
+ if (recorder->codec) {
+ recorder->md.parent.type = gst_droid_codec_get_droid_type (recorder->codec);
+ }
+}
+
+gboolean
+gst_droidcamsrc_recorder_start (GstDroidCamSrcRecorder * recorder)
+{
+ return droid_media_recorder_start (recorder->recorder);
+}
+
+void
+gst_droidcamsrc_recorder_stop (GstDroidCamSrcRecorder * recorder)
+{
+ droid_media_recorder_stop (recorder->recorder);
+}
+
+static void
+gst_droidcamsrc_recorder_data_available (void *data,
+ DroidMediaCodecData * encoded)
+{
+ GstDroidCamSrcRecorder *recorder = (GstDroidCamSrcRecorder *) data;
+ GstDroidCamSrc *src =
+ GST_DROIDCAMSRC (GST_PAD_PARENT (recorder->vidsrc->pad));
+ GstBuffer *buffer = NULL;
+
+ if (encoded->codec_config) {
+ GstBuffer *codec_data = NULL;
+ GstCaps *caps = NULL;
+ GstCaps *current;
+ gboolean ret;
+
+ codec_data =
+ gst_droid_codec_create_encoder_codec_data (recorder->codec,
+ &encoded->data);
+
+ if (!codec_data) {
+ GST_ELEMENT_ERROR (src, STREAM, FORMAT, (NULL),
+ ("Failed to construct codec_data. Expect corrupted stream"));
+ return;
+ }
+
+ current = gst_pad_get_current_caps (recorder->vidsrc->pad);
+ caps = gst_caps_copy (current);
+ gst_caps_unref (current);
+ current = NULL;
+
+ gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, codec_data, NULL);
+ ret = gst_pad_set_caps (recorder->vidsrc->pad, caps);
+ gst_caps_unref (caps);
+
+ if (!ret) {
+ GST_ELEMENT_ERROR (src, STREAM, FORMAT, (NULL),
+ ("Failed to set video caps"));
+ }
+
+ return;
+ }
+
+ buffer =
+ gst_droid_codec_prepare_encoded_data (recorder->codec, &encoded->data);
+ if (!buffer) {
+ GST_ELEMENT_ERROR (src, LIBRARY, ENCODE, (NULL),
+ ("failed to process encoded data"));
+ return;
+ }
+
+ GST_BUFFER_PTS (buffer) = encoded->ts;
+ GST_BUFFER_DTS (buffer) = encoded->decoding_ts;
+
+ if (encoded->sync) {
+ GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_DELTA_UNIT);
+ } else {
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT);
+ }
+
+ gst_droidcamsrc_dev_queue_video_buffer (src->dev, buffer);
+}
|
[-]
[+]
|
Added |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst/droidcamsrc/gstdroidcamsrcrecorder.h
^
|
@@ -0,0 +1,56 @@
+/*
+ * gst-droid
+ *
+ * Copyright (C) 2016 Jolla LTD.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef __GST_DROIDCAMSRC_RECORDER_H__
+#define __GST_DROIDCAMSRC_RECORDER_H__
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+#include <droidmediarecorder.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstDroidCamSrcRecorder GstDroidCamSrcRecorder;
+typedef struct _GstDroidCodec GstDroidCodec;
+typedef struct _GstDroidCamSrcPad GstDroidCamSrcPad;
+
+struct _GstDroidCamSrcRecorder
+{
+ /* opaque */
+
+ GstDroidCamSrcPad *vidsrc;
+ GstDroidCodec *codec;
+ DroidMediaRecorder *recorder;
+ DroidMediaCodecEncoderMetaData md;
+};
+
+GstDroidCamSrcRecorder *gst_droidcamsrc_recorder_create (GstDroidCamSrcPad *vidsrc);
+void gst_droidcamsrc_recorder_destroy (GstDroidCamSrcRecorder *recorder);
+
+gboolean gst_droidcamsrc_recorder_init (GstDroidCamSrcRecorder *recorder, DroidMediaCamera *cam, gint32 target_bitrate);
+
+void gst_droidcamsrc_recorder_update_vid (GstDroidCamSrcRecorder *recorder, GstVideoInfo *info, GstCaps *caps);
+
+gboolean gst_droidcamsrc_recorder_start (GstDroidCamSrcRecorder *recorder);
+void gst_droidcamsrc_recorder_stop (GstDroidCamSrcRecorder *recorder);
+
+G_END_DECLS
+
+#endif /* __GST_DROIDCAMSRC_RECORDER_H__ */
|
[-]
[+]
|
Added |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst/droidcodec/Makefile.am
^
|
@@ -0,0 +1,20 @@
+AM_CPPFLAGS = -DSYSCONFDIR=\"$(sysconfdir)\"
+noinst_LTLIBRARIES = libgstdroidcodec.la
+libgstdroidcodec_la_CFLAGS = $(GST_CFLAGS) $(NGI_CFLAGS) $(EGL_CFLAGS) $(DROID_CFLAGS) $(ORC_CFLAGS) \
+ -I$(top_builddir)/gst/ \
+ -I$(top_builddir)/gst-libs/ \
+ -I/usr/include/droidmedia/
+
+libgstdroidcodec_la_LIBADD = $(GST_LIBS) $(NGI_LIBS) $(EGL_LIBS) $(DROID_LIBS) $(ORC_LIBS)
+
+libgstdroidcodec_la_SOURCES = \
+ gstdroidvdec.c \
+ gstdroidvenc.c \
+ gstdroidadec.c \
+ gstdroidaenc.c
+
+noinst_HEADERS = \
+ gstdroidvdec.h \
+ gstdroidvenc.h \
+ gstdroidadec.h \
+ gstdroidaenc.h
|
[-]
[+]
|
Added |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst/droidcodec/gstdroidadec.c
^
|
@@ -0,0 +1,673 @@
+/*
+ * gst-droid
+ *
+ * Copyright (C) 2014 Mohammed Sameer <msameer@foolab.org>
+ * Copyright (C) 2015 Jolla LTD.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gstdroidadec.h"
+#include "plugin.h"
+#include <string.h> /* memset() */
+#ifdef HAVE_ORC
+#include <orc/orc.h>
+#else
+#define orc_memcpy memcpy
+#endif
+
+#define gst_droidadec_parent_class parent_class
+G_DEFINE_TYPE (GstDroidADec, gst_droidadec, GST_TYPE_AUDIO_DECODER);
+
+GST_DEBUG_CATEGORY_EXTERN (gst_droid_adec_debug);
+#define GST_CAT_DEFAULT gst_droid_adec_debug
+
+static GstStaticPadTemplate gst_droidadec_src_template_factory =
+GST_STATIC_PAD_TEMPLATE (GST_AUDIO_DECODER_SRC_NAME,
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_AUDIO_CAPS_MAKE (GST_AUDIO_DEF_FORMAT)));
+
+static void gst_droidadec_error (void *data, int err);
+static void gst_droidadec_signal_eos (void *data);
+static void gst_droidadec_data_available (void *data,
+ DroidMediaCodecData * encoded);
+static GstFlowReturn gst_droidadec_finish (GstAudioDecoder * decoder);
+
+static gboolean
+gst_droidadec_create_codec (GstDroidADec * dec, GstBuffer * input)
+{
+ DroidMediaCodecDecoderMetaData md;
+ const gchar *droid = gst_droid_codec_get_droid_type (dec->codec_type);
+
+ GST_INFO_OBJECT (dec, "create codec of type %s. Channels: %d, Rate: %d",
+ droid, dec->channels, dec->rate);
+
+ memset (&md, 0x0, sizeof (md));
+
+ md.parent.type = droid;
+ md.parent.channels = dec->channels;
+ md.parent.sample_rate = dec->rate;
+ md.parent.flags = DROID_MEDIA_CODEC_SW_ONLY;
+ md.codec_data.size = 0;
+
+ switch (gst_droid_codec_create_decoder_codec_data (dec->codec_type,
+ dec->codec_data, &md.codec_data, input)) {
+ case GST_DROID_CODEC_CODEC_DATA_OK:
+ break;
+
+ case GST_DROID_CODEC_CODEC_DATA_NOT_NEEDED:
+ g_assert (dec->codec_data == NULL);
+ break;
+
+ case GST_DROID_CODEC_CODEC_DATA_ERROR:
+ GST_ELEMENT_ERROR (dec, STREAM, FORMAT, (NULL),
+ ("Failed to create codec_data."));
+ return FALSE;
+ }
+
+ dec->codec = droid_media_codec_create_decoder (&md);
+
+ if (md.codec_data.size > 0) {
+ g_free (md.codec_data.data);
+ }
+
+ if (!dec->codec) {
+ GST_ELEMENT_ERROR (dec, LIBRARY, SETTINGS, NULL,
+ ("Failed to create decoder"));
+
+ return FALSE;
+ }
+
+ {
+ DroidMediaCodecCallbacks cb;
+ cb.signal_eos = gst_droidadec_signal_eos;
+ cb.error = gst_droidadec_error;
+ cb.size_changed = NULL;
+ droid_media_codec_set_callbacks (dec->codec, &cb, dec);
+ }
+
+ {
+ DroidMediaCodecDataCallbacks cb;
+ cb.data_available = gst_droidadec_data_available;
+ droid_media_codec_set_data_callbacks (dec->codec, &cb, dec);
+ }
+
+ if (!droid_media_codec_start (dec->codec)) {
+ GST_ELEMENT_ERROR (dec, LIBRARY, INIT, (NULL),
+ ("Failed to start the decoder"));
+
+ droid_media_codec_destroy (dec->codec);
+ dec->codec = NULL;
+
+ return FALSE;
+ }
+
+ dec->running = TRUE;
+
+ return TRUE;
+}
+
+static void
+gst_droidadec_data_available (void *data, DroidMediaCodecData * encoded)
+{
+ GstFlowReturn flow_ret;
+ GstDroidADec *dec = (GstDroidADec *) data;
+ GstAudioDecoder *decoder = GST_AUDIO_DECODER (dec);
+ GstBuffer *out;
+ GstMapInfo info;
+
+ GST_DEBUG_OBJECT (dec, "data available of size %d", encoded->data.size);
+
+ GST_AUDIO_DECODER_STREAM_LOCK (decoder);
+
+ if (G_UNLIKELY (dec->downstream_flow_ret != GST_FLOW_OK)) {
+ GST_DEBUG_OBJECT (dec, "not handling data in error state: %s",
+ gst_flow_get_name (dec->downstream_flow_ret));
+ flow_ret = dec->downstream_flow_ret;
+ gst_audio_decoder_finish_frame (decoder, NULL, 1);
+ goto out;
+ }
+
+ if (G_UNLIKELY (gst_audio_decoder_get_audio_info (GST_AUDIO_DECODER
+ (dec))->finfo->format == GST_AUDIO_FORMAT_UNKNOWN)) {
+ DroidMediaCodecMetaData md;
+ DroidMediaRect crop; /* TODO: get rid of that */
+ GstAudioInfo info;
+
+ memset (&md, 0x0, sizeof (md));
+ droid_media_codec_get_output_info (dec->codec, &md, &crop);
+ GST_INFO_OBJECT (dec, "output rate=%d, output channels=%d", md.sample_rate,
+ md.channels);
+
+ gst_audio_info_init (&info);
+ gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_S16, md.sample_rate,
+ md.channels, NULL);
+
+ if (!gst_audio_decoder_set_output_format (decoder, &info)) {
+ flow_ret = GST_FLOW_ERROR;
+ goto out;
+ }
+
+ dec->info = gst_audio_decoder_get_audio_info (GST_AUDIO_DECODER (dec));
+ }
+
+ out = gst_audio_decoder_allocate_output_buffer (decoder, encoded->data.size);
+
+ gst_buffer_map (out, &info, GST_MAP_READWRITE);
+ orc_memcpy (info.data, encoded->data.data, encoded->data.size);
+ gst_buffer_unmap (out, &info);
+
+ // GST_WARNING_OBJECT (dec, "bpf %d, bps %d", dec->info->bpf, GST_AUDIO_INFO_BPS(dec->info));
+ if (dec->spf == -1 || (encoded->data.size == dec->spf * dec->info->bpf
+ && gst_adapter_available (dec->adapter) == 0)) {
+ /* fast path. no need for anything */
+ goto push;
+ }
+
+ gst_adapter_push (dec->adapter, out);
+
+ if (gst_adapter_available (dec->adapter) >= dec->spf * dec->info->bpf) {
+ out = gst_adapter_take_buffer (dec->adapter, dec->spf * dec->info->bpf);
+ } else {
+ flow_ret = GST_FLOW_OK;
+ goto out;
+ }
+
+push:
+ GST_DEBUG_OBJECT (dec, "pushing %d bytes out", gst_buffer_get_size (out));
+
+ flow_ret = gst_audio_decoder_finish_frame (decoder, out, 1);
+
+ if (flow_ret == GST_FLOW_OK || flow_ret == GST_FLOW_FLUSHING) {
+ goto out;
|
[-]
[+]
|
Added |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst/droidcodec/gstdroidadec.h
^
|
@@ -0,0 +1,79 @@
+/*
+ * gst-droid
+ *
+ * Copyright (C) 2014 Mohammed Sameer <msameer@foolab.org>
+ * Copyright (C) 2015 Jolla LTD.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef __GST_DROID_A_DEC_H__
+#define __GST_DROID_A_DEC_H__
+
+#include <gst/gst.h>
+#include <gst/audio/gstaudiodecoder.h>
+#include <gst/base/gstadapter.h>
+#include "gst/droid/gstdroidcodec.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_DROIDADEC \
+ (gst_droidadec_get_type())
+#define GST_DROIDADEC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DROIDADEC, GstDroidADec))
+#define GST_DROIDADEC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DROIDADEC, GstDroidADecClass))
+#define GST_IS_DROIDADEC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DROIDADEC))
+#define GST_IS_DROIDADEC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DROIDADEC))
+
+typedef struct _GstDroidADec GstDroidADec;
+typedef struct _GstDroidADecClass GstDroidADecClass;
+
+struct _GstDroidADec
+{
+ GstAudioDecoder parent;
+ DroidMediaCodec *codec;
+ GstDroidCodec *codec_type;
+
+ gint channels;
+ gint rate;
+
+ /* eos handling */
+ gboolean eos;
+ GMutex eos_lock;
+ GCond eos_cond;
+
+ /* protected by decoder stream lock */
+ GstFlowReturn downstream_flow_ret;
+ GstBuffer *codec_data;
+ gboolean dirty;
+ gint spf;
+ GstAudioInfo *info;
+ GstAdapter *adapter;
+ gboolean running;
+};
+
+struct _GstDroidADecClass
+{
+ GstAudioDecoderClass parent_class;
+};
+
+GType gst_droidadec_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_DROID_A_DEC_H__ */
|
[-]
[+]
|
Added |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst/droidcodec/gstdroidaenc.c
^
|
@@ -0,0 +1,636 @@
+/*
+ * gst-droid
+ *
+ * Copyright (C) 2014-2015 Mohammed Sameer <msameer@foolab.org>
+ * Copyright (C) 2015 Jolla LTD.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gstdroidaenc.h"
+#include "plugin.h"
+#include <string.h>
+
+#define gst_droidaenc_parent_class parent_class
+G_DEFINE_TYPE (GstDroidAEnc, gst_droidaenc, GST_TYPE_AUDIO_ENCODER);
+
+GST_DEBUG_CATEGORY_EXTERN (gst_droid_aenc_debug);
+#define GST_CAT_DEFAULT gst_droid_aenc_debug
+
+static GstStaticPadTemplate gst_droidaenc_sink_template_factory =
+GST_STATIC_PAD_TEMPLATE (GST_AUDIO_ENCODER_SINK_NAME,
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_AUDIO_CAPS_MAKE (GST_AUDIO_DEF_FORMAT)));
+
+enum
+{
+ PROP_0,
+ PROP_TARGET_BITRATE,
+};
+
+#define GST_DROID_A_ENC_TARGET_BITRATE_DEFAULT 128000
+
+static void gst_droidaenc_signal_eos (void *data);
+static void gst_droidaenc_error (void *data, int err);
+static void gst_droidaenc_data_available (void *data,
+ DroidMediaCodecData * encoded);
+
+static gboolean
+gst_droidaenc_negotiate_src_caps (GstDroidAEnc * enc, GstAudioInfo * info)
+{
+ GstCaps *caps, *tpl;
+
+ GST_DEBUG_OBJECT (enc, "negotiate src caps");
+
+ tpl = gst_droid_codec_get_all_caps (GST_DROID_CODEC_ENCODER_AUDIO);
+
+ caps = gst_pad_peer_query_caps (GST_AUDIO_ENCODER_SRC_PAD (GST_AUDIO_ENCODER
+ (enc)), tpl);
+
+ gst_caps_unref (tpl);
+ GST_LOG_OBJECT (enc, "peer caps %" GST_PTR_FORMAT, caps);
+
+ caps = gst_caps_truncate (caps);
+
+ enc->codec_type =
+ gst_droid_codec_new_from_caps (caps, GST_DROID_CODEC_ENCODER_AUDIO);
+ if (!enc->codec_type) {
+ GST_ELEMENT_ERROR (enc, LIBRARY, FAILED, (NULL),
+ ("Unknown codec type for caps %" GST_PTR_FORMAT, caps));
+
+ gst_caps_unref (caps);
+ goto error;
+ }
+
+ gst_caps_set_simple (caps, "channels", G_TYPE_INT, info->channels, "rate",
+ G_TYPE_INT, info->rate, NULL);
+
+ gst_caps_replace (&enc->caps, caps);
+ gst_caps_unref (caps);
+
+ return TRUE;
+
+error:
+ return FALSE;
+}
+
+static gboolean
+gst_droidaenc_create_codec (GstDroidAEnc * enc)
+{
+ DroidMediaCodecEncoderMetaData md;
+ GstAudioInfo info;
+
+ memset (&md, 0x0, sizeof (md));
+
+ gst_audio_info_init (&info);
+ gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_S16, enc->rate,
+ enc->channels, NULL);
+ const gchar *droid = gst_droid_codec_get_droid_type (enc->codec_type);
+
+ GST_INFO_OBJECT (enc, "create codec of type: %s", droid);
+
+ md.parent.type = droid;
+ md.parent.channels = enc->channels;
+ md.parent.sample_rate = enc->rate;
+ md.parent.flags = DROID_MEDIA_CODEC_SW_ONLY;
+ md.meta_data = false;
+ md.bitrate = enc->target_bitrate;
+ md.max_input_size = info.bpf * enc->rate;
+ enc->codec = droid_media_codec_create_encoder (&md);
+
+ if (!enc->codec) {
+ GST_ELEMENT_ERROR (enc, LIBRARY, SETTINGS, NULL,
+ ("Failed to create encoder"));
+ return FALSE;
+ }
+
+ {
+ DroidMediaCodecCallbacks cb;
+ cb.signal_eos = gst_droidaenc_signal_eos;
+ cb.error = gst_droidaenc_error;
+ droid_media_codec_set_callbacks (enc->codec, &cb, enc);
+ }
+
+ {
+ DroidMediaCodecDataCallbacks cb;
+ cb.data_available = gst_droidaenc_data_available;
+ droid_media_codec_set_data_callbacks (enc->codec, &cb, enc);
+ }
+
+ if (!droid_media_codec_start (enc->codec)) {
+ GST_ELEMENT_ERROR (enc, LIBRARY, INIT, (NULL),
+ ("Failed to start the encoder"));
+
+ droid_media_codec_destroy (enc->codec);
+ enc->codec = NULL;
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void
+gst_droidaenc_signal_eos (void *data)
+{
+ GstDroidAEnc *enc = (GstDroidAEnc *) data;
+
+ GST_DEBUG_OBJECT (enc, "codec signaled EOS");
+
+ g_mutex_lock (&enc->eos_lock);
+
+ if (!enc->eos) {
+ GST_WARNING_OBJECT (enc, "codec signaled EOS but we are not expecting it");
+ }
+
+ g_cond_signal (&enc->eos_cond);
+ g_mutex_unlock (&enc->eos_lock);
+}
+
+static void
+gst_droidaenc_error (void *data, int err)
+{
+ GstDroidAEnc *enc = (GstDroidAEnc *) data;
+
+ GST_DEBUG_OBJECT (enc, "codec error");
+
+ g_mutex_lock (&enc->eos_lock);
+
+ if (enc->eos) {
+ /* Gotta love Android. We will ignore errors if we are expecting EOS */
+ g_cond_signal (&enc->eos_cond);
+ goto out;
+ }
+
+ GST_AUDIO_ENCODER_STREAM_LOCK (enc);
+ enc->downstream_flow_ret = GST_FLOW_ERROR;
+ GST_AUDIO_ENCODER_STREAM_UNLOCK (enc);
+
+ GST_ELEMENT_ERROR (enc, LIBRARY, FAILED, NULL,
+ ("error 0x%x from android codec", -err));
+
+out:
+ g_mutex_unlock (&enc->eos_lock);
+}
+
+static void
+gst_droidaenc_data_available (void *data, DroidMediaCodecData * encoded)
+{
+ GstFlowReturn flow_ret;
+ GstDroidAEnc *enc = (GstDroidAEnc *) data;
+ GstAudioEncoder *encoder = GST_AUDIO_ENCODER (enc);
+ GstBuffer *buffer;
+
|
[-]
[+]
|
Added |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst/droidcodec/gstdroidaenc.h
^
|
@@ -0,0 +1,77 @@
+/*
+ * gst-droid
+ *
+ * Copyright (C) 2014 Mohammed Sameer <msameer@foolab.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef __GST_DROID_A_ENC_H__
+#define __GST_DROID_A_ENC_H__
+
+#include <gst/gst.h>
+#include <gst/audio/gstaudioencoder.h>
+#include "gst/droid/gstdroidcodec.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_DROIDAENC \
+ (gst_droidaenc_get_type())
+#define GST_DROIDAENC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DROIDAENC, GstDroidAEnc))
+#define GST_DROIDAENC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DROIDAENC, GstDroidAEncClass))
+#define GST_IS_DROIDAENC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DROIDAENC))
+#define GST_IS_DROIDAENC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DROIDAENC))
+
+typedef struct _GstDroidAEnc GstDroidAEnc;
+typedef struct _GstDroidAEncClass GstDroidAEncClass;
+
+struct _GstDroidAEnc
+{
+ GstAudioEncoder parent;
+ DroidMediaCodec *codec;
+ GstDroidCodec *codec_type;
+ gboolean first_frame_sent;
+
+ GstCaps *caps;
+ gint channels;
+ gint rate;
+
+ gint32 target_bitrate;
+
+ /* eos handling */
+ gboolean eos;
+ GMutex eos_lock;
+ GCond eos_cond;
+
+ /* protected by decoder stream lock */
+ GstFlowReturn downstream_flow_ret;
+ gboolean dirty;
+ gboolean finished;
+};
+
+struct _GstDroidAEncClass
+{
+ GstAudioEncoderClass parent_class;
+};
+
+GType gst_droidaenc_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_DROID_A_ENC_H__ */
|
[-]
[+]
|
Added |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst/droidcodec/gstdroidvdec.c
^
|
@@ -0,0 +1,1205 @@
+/*
+ * gst-droid
+ *
+ * Copyright (C) 2014 Mohammed Sameer <msameer@foolab.org>
+ * Copyright (C) 2015 Jolla LTD.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gstdroidvdec.h"
+#include "gst/droid/gstdroidmediabuffer.h"
+#include "gst/droid/gstdroidbufferpool.h"
+#include "plugin.h"
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#include <string.h> /* memset() */
+#ifdef HAVE_ORC
+#include <orc/orc.h>
+#else
+#define orc_memcpy memcpy
+#endif
+
+#define GST_DROID_DEC_NUM_BUFFERS 2
+
+#define gst_droidvdec_parent_class parent_class
+G_DEFINE_TYPE (GstDroidVDec, gst_droidvdec, GST_TYPE_VIDEO_DECODER);
+
+GST_DEBUG_CATEGORY_EXTERN (gst_droid_vdec_debug);
+#define GST_CAT_DEFAULT gst_droid_vdec_debug
+
+static GstStaticPadTemplate gst_droidvdec_src_template_factory =
+ GST_STATIC_PAD_TEMPLATE (GST_VIDEO_DECODER_SRC_NAME,
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
+ (GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_BUFFER, "{YV12}") ";"
+ GST_VIDEO_CAPS_MAKE ("I420")));
+
+static gboolean gst_droidvdec_configure_state (GstVideoDecoder * decoder,
+ guint width, guint height);
+static void gst_droidvdec_error (void *data, int err);
+static int gst_droidvdec_size_changed (void *data, int32_t width,
+ int32_t height);
+static void gst_droidvdec_signal_eos (void *data);
+static void gst_droidvdec_buffers_released (void *user);
+static void gst_droidvdec_frame_available (void *user);
+static void gst_droidvdec_data_available (void *data,
+ DroidMediaCodecData * encoded);
+static gboolean gst_droidvdec_convert_buffer (GstDroidVDec * dec,
+ GstBuffer * out, DroidMediaData * in, GstVideoInfo * info);
+static void gst_droidvdec_loop (GstDroidVDec * dec);
+static GstFlowReturn gst_droidvdec_finish_frame (GstVideoDecoder * decoder,
+ GstVideoCodecFrame * frame);
+
+static void
+gst_droidvdec_loop (GstDroidVDec * dec)
+{
+ GST_LOG_OBJECT (dec, "loop");
+
+ if (!gst_droid_buffer_pool_wait_for_buffer (dec->pool)) {
+ goto out;
+ }
+
+ while (droid_media_codec_loop (dec->codec)
+ == DROID_MEDIA_CODEC_LOOP_OK) {
+ GST_LOG_OBJECT (dec, "tick");
+ return;
+ }
+
+out:
+ GST_INFO_OBJECT (dec, "pausing task");
+ gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (GST_VIDEO_DECODER (dec)));
+}
+
+static gboolean
+gst_droidvdec_create_codec (GstDroidVDec * dec, GstBuffer * input)
+{
+ DroidMediaCodecDecoderMetaData md;
+ const gchar *droid = gst_droid_codec_get_droid_type (dec->codec_type);
+
+ GST_INFO_OBJECT (dec, "create codec of type %s: %dx%d",
+ droid, dec->in_state->info.width, dec->in_state->info.height);
+
+ memset (&md, 0x0, sizeof (md));
+
+ /* Let's take care of the buffer pool first */
+ if (!dec->pool) {
+ GstStructure *config;
+
+ dec->pool = gst_droid_buffer_pool_new ();
+ config = gst_buffer_pool_get_config (dec->pool);
+ /* pass NULL for the caps. We don't have it yet */
+ gst_buffer_pool_config_set_params (config, NULL, 0,
+ GST_DROID_DEC_NUM_BUFFERS, GST_DROID_DEC_NUM_BUFFERS);
+
+ if (!gst_buffer_pool_set_config (dec->pool, config)) {
+ GST_ELEMENT_ERROR (dec, STREAM, FAILED, (NULL),
+ ("Failed to configure buffer pool"));
+ return FALSE;
+ }
+
+ if (!gst_buffer_pool_set_active (dec->pool, TRUE)) {
+ GST_ELEMENT_ERROR (dec, STREAM, FAILED, (NULL),
+ ("Failed to activate buffer pool"));
+ return FALSE;
+ }
+ } else {
+ gst_buffer_pool_set_flushing (dec->pool, FALSE);
+ }
+
+ md.parent.type = droid;
+ md.parent.width = dec->in_state->info.width;
+ md.parent.height = dec->in_state->info.height;
+ md.parent.fps = dec->in_state->info.fps_n / dec->in_state->info.fps_d;
+ md.parent.flags =
+ DROID_MEDIA_CODEC_HW_ONLY | DROID_MEDIA_CODEC_USE_EXTERNAL_LOOP;
+ md.codec_data.size = 0;
+
+ if (dec->format == GST_VIDEO_FORMAT_I420) {
+ md.parent.flags |= DROID_MEDIA_CODEC_NO_MEDIA_BUFFER;
+ }
+
+ switch (gst_droid_codec_create_decoder_codec_data (dec->codec_type,
+ dec->codec_data, &md.codec_data, input)) {
+ case GST_DROID_CODEC_CODEC_DATA_OK:
+ break;
+
+ case GST_DROID_CODEC_CODEC_DATA_NOT_NEEDED:
+ g_assert (dec->codec_data == NULL);
+ break;
+
+ case GST_DROID_CODEC_CODEC_DATA_ERROR:
+ GST_ELEMENT_ERROR (dec, STREAM, FORMAT, (NULL),
+ ("Failed to create codec_data."));
+ goto error;
+ }
+
+ dec->codec = droid_media_codec_create_decoder (&md);
+
+ if (md.codec_data.size > 0) {
+ g_free (md.codec_data.data);
+ }
+
+ if (!dec->codec) {
+ GST_ELEMENT_ERROR (dec, LIBRARY, SETTINGS, NULL,
+ ("Failed to create decoder"));
+
+ goto error;
+ }
+
+ dec->queue = droid_media_codec_get_buffer_queue (dec->codec);
+
+ {
+ DroidMediaCodecCallbacks cb;
+ cb.signal_eos = gst_droidvdec_signal_eos;
+ cb.error = gst_droidvdec_error;
+ cb.size_changed = gst_droidvdec_size_changed;
+ droid_media_codec_set_callbacks (dec->codec, &cb, dec);
+ }
+
+ if (dec->queue) {
+ DroidMediaBufferQueueCallbacks cb;
+ cb.buffers_released = gst_droidvdec_buffers_released;
+ cb.frame_available = gst_droidvdec_frame_available;
+ droid_media_buffer_queue_set_callbacks (dec->queue, &cb, dec);
+ } else {
+ DroidMediaCodecDataCallbacks cb;
+ cb.data_available = gst_droidvdec_data_available;
+ droid_media_codec_set_data_callbacks (dec->codec, &cb, dec);
+ }
+
+ if (!droid_media_codec_start (dec->codec)) {
+ GST_ELEMENT_ERROR (dec, LIBRARY, INIT, (NULL),
+ ("Failed to start the decoder"));
+
+ droid_media_codec_destroy (dec->codec);
+ dec->codec = NULL;
+ dec->queue = NULL;
+
+ goto error;
+ }
+
+ /* now start our task */
|
[-]
[+]
|
Added |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst/droidcodec/gstdroidvdec.h
^
|
@@ -0,0 +1,95 @@
+/*
+ * gst-droid
+ *
+ * Copyright (C) 2014 Mohammed Sameer <msameer@foolab.org>
+ * Copyright (C) 2015 Jolla LTD.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef __GST_DROID_V_DEC_H__
+#define __GST_DROID_V_DEC_H__
+
+#include <gst/gst.h>
+#include <gst/video/gstvideodecoder.h>
+#include "gst/droid/gstdroidcodec.h"
+#include "droidmediaconvert.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_DROIDVDEC \
+ (gst_droidvdec_get_type())
+#define GST_DROIDVDEC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DROIDVDEC, GstDroidVDec))
+#define GST_DROIDVDEC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DROIDVDEC, GstDroidVDecClass))
+#define GST_IS_DROIDVDEC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DROIDVDEC))
+#define GST_IS_DROIDVDEC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DROIDVDEC))
+
+typedef struct _GstDroidVDec GstDroidVDec;
+typedef struct _GstDroidVDecClass GstDroidVDecClass;
+typedef enum _GstDroidVDecState GstDroidVDecState;
+
+enum _GstDroidVDecState
+{
+ GST_DROID_VDEC_STATE_OK,
+ GST_DROID_VDEC_STATE_ERROR,
+ GST_DROID_VDEC_STATE_WAITING_FOR_EOS,
+ GST_DROID_VDEC_STATE_EOS,
+};
+
+struct _GstDroidVDec
+{
+ GstVideoDecoder parent;
+ DroidMediaCodec *codec;
+ DroidMediaBufferQueue *queue;
+ GstAllocator *allocator;
+ GstDroidCodec *codec_type;
+
+ /* eos handling */
+ GstDroidVDecState state;
+ GMutex state_lock;
+ GCond state_cond;
+
+ GstBufferPool *pool;
+
+ /* protected by decoder stream lock */
+ GstFlowReturn downstream_flow_ret;
+ GstBuffer *codec_data;
+ gboolean dirty;
+ DroidMediaRect crop_rect;
+ gboolean running;
+ GstVideoFormat format;
+
+ gsize codec_reported_height;
+ gsize codec_reported_width;
+
+ GstVideoCodecState *in_state;
+ GstVideoCodecState *out_state;
+ DroidMediaConvert *convert;
+};
+
+struct _GstDroidVDecClass
+{
+ GstVideoDecoderClass parent_class;
+};
+
+GType gst_droidvdec_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_DROID_V_DEC_H__ */
|
[-]
[+]
|
Added |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst/droidcodec/gstdroidvenc.c
^
|
@@ -0,0 +1,776 @@
+/*
+ * gst-droid
+ *
+ * Copyright (C) 2014-2015 Mohammed Sameer <msameer@foolab.org>
+ * Copyright (C) 2015 Jolla LTD.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gstdroidvenc.h"
+#include "gst/droid/gstwrappedmemory.h"
+#include "gst/droid/gstdroidquery.h"
+#include "plugin.h"
+#include <string.h>
+
+#define gst_droidvenc_parent_class parent_class
+G_DEFINE_TYPE (GstDroidVEnc, gst_droidvenc, GST_TYPE_VIDEO_ENCODER);
+
+GST_DEBUG_CATEGORY_EXTERN (gst_droid_venc_debug);
+#define GST_CAT_DEFAULT gst_droid_venc_debug
+
+#define GST_DROIDVENC_EOS_TIMEOUT_SEC 2
+
+static GstStaticPadTemplate gst_droidvenc_sink_template_factory =
+GST_STATIC_PAD_TEMPLATE (GST_VIDEO_ENCODER_SINK_NAME,
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
+ (GST_CAPS_FEATURE_MEMORY_DROID_VIDEO_META_DATA, "{YV12}")));
+
+enum
+{
+ PROP_0,
+ PROP_TARGET_BITRATE,
+};
+
+#define GST_DROID_ENC_TARGET_BITRATE_DEFAULT 192000
+
+typedef struct
+{
+ GstMapInfo info;
+ GstVideoCodecFrame *frame;
+} GstDroidVEncFrameReleaseData;
+
+static GstVideoCodecState *gst_droidvenc_configure_state (GstDroidVEnc * enc,
+ GstCaps * caps);
+static void gst_droidvenc_signal_eos (void *data);
+static void gst_droidvenc_error (void *data, int err);
+static void
+gst_droidvenc_data_available (void *data, DroidMediaCodecData * encoded);
+static void gst_droidvenc_release_input_frame (void *data);
+
+static void
+gst_droidvenc_release_input_frame (void *data)
+{
+ GstDroidVEncFrameReleaseData *release_data =
+ (GstDroidVEncFrameReleaseData *) data;
+
+ gst_buffer_unmap (release_data->frame->input_buffer, &release_data->info);
+
+ /* We need to release the input buffer */
+ gst_buffer_unref (release_data->frame->input_buffer);
+ release_data->frame->input_buffer = NULL;
+
+ gst_video_codec_frame_unref (release_data->frame);
+
+ g_slice_free (GstDroidVEncFrameReleaseData, release_data);
+}
+
+static gboolean
+gst_droidvenc_negotiate_src_caps (GstDroidVEnc * enc)
+{
+ GstCaps *caps;
+
+ GST_DEBUG_OBJECT (enc, "negotiate src caps");
+
+ caps =
+ gst_pad_peer_query_caps (GST_VIDEO_ENCODER_SRC_PAD (GST_VIDEO_ENCODER
+ (enc)), NULL);
+
+ GST_LOG_OBJECT (enc, "peer caps %" GST_PTR_FORMAT, caps);
+
+ caps = gst_caps_truncate (caps);
+
+ enc->codec_type =
+ gst_droid_codec_new_from_caps (caps, GST_DROID_CODEC_ENCODER_VIDEO);
+ if (!enc->codec_type) {
+ GST_ELEMENT_ERROR (enc, LIBRARY, FAILED, (NULL),
+ ("Unknown codec type for caps %" GST_PTR_FORMAT, caps));
+
+ gst_caps_unref (caps);
+ goto error;
+ }
+
+ /* ownership of caps is transferred */
+ enc->out_state = gst_droidvenc_configure_state (enc, caps);
+
+ return TRUE;
+
+error:
+ return FALSE;
+}
+
+static gboolean
+gst_droidvenc_create_codec (GstDroidVEnc * enc)
+{
+ DroidMediaCodecEncoderMetaData md;
+ GstQuery *query;
+
+ const gchar *droid = gst_droid_codec_get_droid_type (enc->codec_type);
+
+ GST_INFO_OBJECT (enc,
+ "create codec of type: %s resolution: %dx%d bitrate: %d", droid,
+ enc->in_state->info.width, enc->in_state->info.height,
+ enc->target_bitrate);
+
+ memset (&md, 0x0, sizeof (md));
+
+ md.parent.type = droid;
+ md.parent.width = enc->in_state->info.width;
+ md.parent.height = enc->in_state->info.height;
+ md.parent.fps = enc->in_state->info.fps_n / enc->in_state->info.fps_d; // TODO: bad
+ md.parent.flags = DROID_MEDIA_CODEC_HW_ONLY;
+ md.bitrate = enc->target_bitrate;
+ md.stride = enc->in_state->info.width;
+ md.slice_height = enc->in_state->info.height;
+
+ /* TODO: get this from caps */
+ md.meta_data = true;
+
+ query = gst_droid_query_new_video_color_format ();
+ if (!gst_pad_peer_query (GST_VIDEO_ENCODER_SINK_PAD (GST_VIDEO_ENCODER (enc)),
+ query)) {
+ gst_query_unref (query);
+ GST_ELEMENT_ERROR (enc, LIBRARY, SETTINGS, NULL,
+ ("Failed to query video color format"));
+ return FALSE;
+ }
+
+ if (!gst_droid_query_parse_video_color_format (query, &md.color_format)) {
+ gst_query_unref (query);
+ GST_ELEMENT_ERROR (enc, LIBRARY, SETTINGS, NULL,
+ ("Failed to get video color format"));
+ return FALSE;
+ }
+
+ gst_query_unref (query);
+
+ enc->codec = droid_media_codec_create_encoder (&md);
+
+ if (!enc->codec) {
+ GST_ELEMENT_ERROR (enc, LIBRARY, SETTINGS, NULL,
+ ("Failed to create encoder"));
+ return FALSE;
+ }
+
+ {
+ DroidMediaCodecCallbacks cb;
+ cb.signal_eos = gst_droidvenc_signal_eos;
+ cb.error = gst_droidvenc_error;
+ droid_media_codec_set_callbacks (enc->codec, &cb, enc);
+ }
+
+ {
+ DroidMediaCodecDataCallbacks cb;
+ cb.data_available = gst_droidvenc_data_available;
+ droid_media_codec_set_data_callbacks (enc->codec, &cb, enc);
+ }
+
+ if (!droid_media_codec_start (enc->codec)) {
+ GST_ELEMENT_ERROR (enc, LIBRARY, INIT, (NULL),
+ ("Failed to start the encoder"));
+
+ droid_media_codec_destroy (enc->codec);
+ enc->codec = NULL;
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void
+gst_droidvenc_signal_eos (void *data)
|
[-]
[+]
|
Added |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst/droidcodec/gstdroidvenc.h
^
|
@@ -0,0 +1,73 @@
+/*
+ * gst-droid
+ *
+ * Copyright (C) 2014 Mohammed Sameer <msameer@foolab.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef __GST_DROID_V_ENC_H__
+#define __GST_DROID_V_ENC_H__
+
+#include <gst/gst.h>
+#include <gst/video/gstvideoencoder.h>
+#include "gst/droid/gstdroidcodec.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_DROIDVENC \
+ (gst_droidvenc_get_type())
+#define GST_DROIDVENC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DROIDVENC, GstDroidVEnc))
+#define GST_DROIDVENC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DROIDVENC, GstDroidVEncClass))
+#define GST_IS_DROIDVENC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DROIDVENC))
+#define GST_IS_DROIDVENC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DROIDVENC))
+
+typedef struct _GstDroidVEnc GstDroidVEnc;
+typedef struct _GstDroidVEncClass GstDroidVEncClass;
+
+struct _GstDroidVEnc
+{
+ GstVideoEncoder parent;
+ DroidMediaCodec *codec;
+ GstDroidCodec *codec_type;
+ GstVideoCodecState *in_state;
+ GstVideoCodecState *out_state;
+ gboolean first_frame_sent;
+ gint32 target_bitrate;
+
+ /* eos handling */
+ gboolean eos;
+ GMutex eos_lock;
+ GCond eos_cond;
+
+ /* protected by decoder stream lock */
+ GstFlowReturn downstream_flow_ret;
+ gboolean dirty;
+};
+
+struct _GstDroidVEncClass
+{
+ GstVideoEncoderClass parent_class;
+};
+
+GType gst_droidvenc_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_DROID_V_ENC_H__ */
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20171129.0.tar.gz/gst/plugin.c
^
|
@@ -26,9 +26,18 @@
#include "plugin.h"
#include "gstdroidcamsrc.h"
#include "gstdroideglsink.h"
+#include "gstdroidvdec.h"
+#include "gstdroidvenc.h"
+#include "gstdroidadec.h"
+#include "gstdroidaenc.h"
#include "droidmedia.h"
GST_DEBUG_CATEGORY (gst_droid_camsrc_debug);
+GST_DEBUG_CATEGORY (gst_droid_adec_debug);
+GST_DEBUG_CATEGORY (gst_droid_aenc_debug);
+GST_DEBUG_CATEGORY (gst_droid_vdec_debug);
+GST_DEBUG_CATEGORY (gst_droid_venc_debug);
+GST_DEBUG_CATEGORY (gst_droid_codec_debug);
GST_DEBUG_CATEGORY (gst_droid_eglsink_debug);
static gboolean
@@ -42,11 +51,35 @@
GST_DEBUG_CATEGORY_INIT (gst_droid_eglsink_debug, "droideglsink",
0, "Android EGL sink");
+ GST_DEBUG_CATEGORY_INIT (gst_droid_adec_debug, "droidadec",
+ 0, "Android HAL audio decoder");
+
+ GST_DEBUG_CATEGORY_INIT (gst_droid_aenc_debug, "droidaenc",
+ 0, "Android HAL audio encoder");
+
+ GST_DEBUG_CATEGORY_INIT (gst_droid_vdec_debug, "droidvdec",
+ 0, "Android HAL video decoder");
+
+ GST_DEBUG_CATEGORY_INIT (gst_droid_venc_debug, "droidvenc",
+ 0, "Android HAL video encoder");
+
+ GST_DEBUG_CATEGORY_INIT (gst_droid_codec_debug, "droidcodec",
+ 0, "Android HAL codec");
+
ok &= gst_element_register (plugin, "droidcamsrc", GST_RANK_PRIMARY,
GST_TYPE_DROIDCAMSRC);
ok &= gst_element_register (plugin, "droideglsink", GST_RANK_PRIMARY,
GST_TYPE_DROIDEGLSINK);
+ ok &= gst_element_register (plugin, "droidvdec", GST_RANK_PRIMARY + 1,
+ GST_TYPE_DROIDVDEC);
+ ok &= gst_element_register (plugin, "droidvenc", GST_RANK_PRIMARY + 1,
+ GST_TYPE_DROIDVENC);
+ ok &= gst_element_register (plugin, "droidadec", GST_RANK_PRIMARY + 1,
+ GST_TYPE_DROIDADEC);
+ ok &= gst_element_register (plugin, "droidaenc", GST_RANK_PRIMARY + 1,
+ GST_TYPE_DROIDAENC);
+
if (ok)
droid_media_init ();
|