[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:gst-droid.spec
^
|
|
[-]
[+]
|
Changed |
_service
^
|
@@ -6,4 +6,4 @@
<param name="token"/>
<param name="debian">N</param>
<param name="dumb">N</param>
-</service></services>
+</service></services>
\ No newline at end of file
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20190805.0.tar.gz/gst-libs/gst/droid/gstdroidcodec.c
^
|
@@ -52,7 +52,6 @@
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);
@@ -109,10 +108,6 @@
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,
@@ -586,15 +581,6 @@
}
static gboolean
-is_mp3 (GstDroidCodec * codec G_GNUC_UNUSED, const GstStructure * s)
-{
- gint val, layer;
-
- return gst_structure_get_int (s, "mpegversion", &val) && val == 1 &&
- gst_structure_get_int (s, "layer", &layer) && (layer == 1 || layer == 3);
-}
-
-static gboolean
is_h264_dec (GstDroidCodec * codec G_GNUC_UNUSED, const GstStructure * s)
{
const char *alignment = gst_structure_get_string (s, "alignment");
@@ -1086,6 +1072,7 @@
|| codec->info->type ==
GST_DROID_CODEC_DECODER_VIDEO) ? "decoder-quirks" : "encoder-quirks";
gsize quirks_length = 0;
+ codec->quirks = 0;
int x;
g_key_file_load_from_file (file, path, G_KEY_FILE_NONE, NULL);
@@ -1104,7 +1091,6 @@
goto out;
}
- codec->quirks = 0;
for (x = 0; x < quirks_length; x++) {
if (!g_strcmp0 (quirks_string[x], USE_CODEC_SUPPLIED_HEIGHT_NAME)) {
codec->quirks |= USE_CODEC_SUPPLIED_HEIGHT_VALUE;
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20190805.0.tar.gz/gst-libs/gst/droid/gstdroidmediabuffer.c
^
|
@@ -35,7 +35,6 @@
{
GstAllocator parent;
- DroidMediaPixelFormatConstants c;
} GstDroidMediaBufferAllocator;
typedef struct
@@ -49,9 +48,23 @@
GstMemory mem;
DroidMediaBuffer *buffer;
+ GstVideoInfo video_info;
+ gpointer map_data;
+ int map_count;
+ GstMapFlags map_flags;
} GstDroidMediaBufferMemory;
+typedef struct
+{
+ int hal_format;
+ GstVideoFormat gst_format;
+ int bytes_per_pixel;
+ int h_align;
+ int v_align;
+
+} GstDroidMediaBufferFormatMap;
+
#define _do_init \
GST_DEBUG_CATEGORY_INIT (droid_memory_debug, "droidmemory", 0, \
"droid memory allocator");
@@ -65,6 +78,133 @@
static void gst_droid_media_buffer_allocator_free (GstAllocator * allocator,
GstMemory * mem);
+static gpointer gst_droid_media_buffer_memory_map (GstMemory * mem,
+ gsize maxsize, GstMapFlags flags);
+static void gst_droid_media_buffer_memory_unmap (GstMemory * mem);
+
+#define GST_DROID_MEDIA_BUFFER_FORMAT_COUNT 11
+
+static GstDroidMediaBufferFormatMap
+ gst_droid_media_buffer_formats[GST_DROID_MEDIA_BUFFER_FORMAT_COUNT];
+
+static void
+gst_droid_media_buffer_initialize_format_map ()
+{
+ DroidMediaPixelFormatConstants constants;
+ static gboolean initialized = FALSE;
+
+ if (!initialized) {
+ droid_media_pixel_format_constants_init (&constants);
+
+ gst_droid_media_buffer_formats[0].hal_format =
+ constants.HAL_PIXEL_FORMAT_RGBA_8888;
+ gst_droid_media_buffer_formats[0].gst_format = GST_VIDEO_FORMAT_RGBA;
+ gst_droid_media_buffer_formats[0].bytes_per_pixel = 4;
+ gst_droid_media_buffer_formats[0].h_align = 4;
+ gst_droid_media_buffer_formats[0].v_align = 1;
+
+ gst_droid_media_buffer_formats[1].hal_format =
+ constants.HAL_PIXEL_FORMAT_RGBX_8888;
+ gst_droid_media_buffer_formats[1].gst_format = GST_VIDEO_FORMAT_RGBx;
+ gst_droid_media_buffer_formats[1].bytes_per_pixel = 4;
+ gst_droid_media_buffer_formats[1].h_align = 4;
+ gst_droid_media_buffer_formats[1].v_align = 1;
+
+ gst_droid_media_buffer_formats[2].hal_format =
+ constants.HAL_PIXEL_FORMAT_RGB_888;
+ gst_droid_media_buffer_formats[2].gst_format = GST_VIDEO_FORMAT_RGB;
+ gst_droid_media_buffer_formats[2].bytes_per_pixel = 3;
+ gst_droid_media_buffer_formats[2].h_align = 4;
+ gst_droid_media_buffer_formats[2].v_align = 1;
+
+ gst_droid_media_buffer_formats[3].hal_format =
+ constants.HAL_PIXEL_FORMAT_RGB_565;
+ gst_droid_media_buffer_formats[3].gst_format = GST_VIDEO_FORMAT_RGB16;
+ gst_droid_media_buffer_formats[3].bytes_per_pixel = 2;
+ gst_droid_media_buffer_formats[3].h_align = 4;
+ gst_droid_media_buffer_formats[3].v_align = 1;
+
+ gst_droid_media_buffer_formats[4].hal_format =
+ constants.HAL_PIXEL_FORMAT_BGRA_8888;
+ gst_droid_media_buffer_formats[4].gst_format = GST_VIDEO_FORMAT_BGRA;
+ gst_droid_media_buffer_formats[4].bytes_per_pixel = 4;
+ gst_droid_media_buffer_formats[4].h_align = 4;
+ gst_droid_media_buffer_formats[4].v_align = 1;
+
+ gst_droid_media_buffer_formats[5].hal_format =
+ constants.HAL_PIXEL_FORMAT_YV12;
+ gst_droid_media_buffer_formats[5].gst_format = GST_VIDEO_FORMAT_YV12;
+ gst_droid_media_buffer_formats[5].bytes_per_pixel = 1;
+ gst_droid_media_buffer_formats[5].h_align = 1;
+ gst_droid_media_buffer_formats[5].v_align = 1;
+
+ gst_droid_media_buffer_formats[6].hal_format =
+ constants.HAL_PIXEL_FORMAT_YCbCr_422_SP;
+ gst_droid_media_buffer_formats[6].gst_format = GST_VIDEO_FORMAT_NV16;
+ gst_droid_media_buffer_formats[6].bytes_per_pixel = 1;
+ gst_droid_media_buffer_formats[6].h_align = 1;
+ gst_droid_media_buffer_formats[6].v_align = 1;
+
+ gst_droid_media_buffer_formats[7].hal_format =
+ constants.HAL_PIXEL_FORMAT_YCrCb_420_SP;
+ gst_droid_media_buffer_formats[7].gst_format = GST_VIDEO_FORMAT_NV21;
+ gst_droid_media_buffer_formats[7].bytes_per_pixel = 1;
+ gst_droid_media_buffer_formats[7].h_align = 1;
+ gst_droid_media_buffer_formats[7].v_align = 1;
+
+ gst_droid_media_buffer_formats[8].hal_format =
+ constants.HAL_PIXEL_FORMAT_YCbCr_422_I;
+ gst_droid_media_buffer_formats[8].gst_format = GST_VIDEO_FORMAT_YUY2;
+ gst_droid_media_buffer_formats[8].bytes_per_pixel = 1;
+ gst_droid_media_buffer_formats[8].h_align = 1;
+ gst_droid_media_buffer_formats[8].v_align = 1;
+
+ gst_droid_media_buffer_formats[9].hal_format =
+ constants.QOMX_COLOR_FormatYUV420PackedSemiPlanar32m;
+ gst_droid_media_buffer_formats[9].gst_format = GST_VIDEO_FORMAT_YV12;
+ gst_droid_media_buffer_formats[9].bytes_per_pixel = 1;
+ gst_droid_media_buffer_formats[9].h_align = 128;
+ gst_droid_media_buffer_formats[9].v_align = 32;
+
+ gst_droid_media_buffer_formats[10].hal_format =
+ constants.QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka;
+ gst_droid_media_buffer_formats[10].gst_format = GST_VIDEO_FORMAT_NV12_64Z32;
+ gst_droid_media_buffer_formats[10].bytes_per_pixel = 0;
+ gst_droid_media_buffer_formats[10].h_align = 0;
+ gst_droid_media_buffer_formats[10].v_align = 0;
+ }
+}
+
+static int
+gst_droid_media_buffer_index_of_hal_format (int format)
+{
+ int i;
+
+ gst_droid_media_buffer_initialize_format_map ();
+
+ for (i = 0; i < GST_DROID_MEDIA_BUFFER_FORMAT_COUNT; ++i) {
+ if (gst_droid_media_buffer_formats[i].hal_format == format) {
+ return i;
+ }
+ }
+ return GST_DROID_MEDIA_BUFFER_FORMAT_COUNT;
+}
+
+static int
+gst_droid_media_buffer_index_of_gst_format (GstVideoFormat format)
+{
+ int i;
+
+ gst_droid_media_buffer_initialize_format_map ();
+
+ for (i = 0; i < GST_DROID_MEDIA_BUFFER_FORMAT_COUNT; ++i) {
+ if (gst_droid_media_buffer_formats[i].gst_format == format) {
+ return i;
+ }
+ }
+ return GST_DROID_MEDIA_BUFFER_FORMAT_COUNT;
+}
+
GstAllocator *
gst_droid_media_buffer_allocator_new (void)
{
@@ -80,17 +220,17 @@
alloc->mem_type = GST_ALLOCATOR_DROID_MEDIA_BUFFER;
- alloc->mem_map = NULL;
- alloc->mem_unmap = NULL;
+ alloc->mem_map = gst_droid_media_buffer_memory_map;
+ alloc->mem_unmap = gst_droid_media_buffer_memory_unmap;
alloc->mem_copy = NULL;
alloc->mem_share = NULL;
alloc->mem_is_span = NULL;
- droid_media_pixel_format_constants_init (&allocator->c);
-
GST_OBJECT_FLAG_SET (allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC);
}
+#define ALIGN_SIZE(size, to) (((size) + to - 1) & ~(to - 1))
+
static void
droid_media_buffer_allocator_class_init (GstDroidMediaBufferAllocatorClass *
klass)
@@ -101,13 +241,56 @@
allocator_class->free = gst_droid_media_buffer_allocator_free;
}
+static GstDroidMediaBufferMemory *
+gst_droid_media_buffer_allocator_alloc_from_buffer (GstAllocator * allocator,
+ DroidMediaBuffer * buffer, int format_index, gsize width, gsize height,
+ gsize stride)
+{
+ GstDroidMediaBufferMemory *mem = g_slice_new0 (GstDroidMediaBufferMemory);
+ GstFormat format;
+ gsize padded_width = width;
+ gsize padded_height = height;
+
+ mem->buffer = buffer;
+ mem->map_data = NULL;
+ mem->map_flags = 0;
+ mem->map_count = 0;
+
+ if (format_index == GST_DROID_MEDIA_BUFFER_FORMAT_COUNT) {
+ format = GST_VIDEO_FORMAT_ENCODED;
+ } else {
+ format = gst_droid_media_buffer_formats[format_index].gst_format;
+ if (gst_droid_media_buffer_formats[format_index].bytes_per_pixel != 0) {
+ padded_width =
+ ALIGN_SIZE (stride,
+ gst_droid_media_buffer_formats[format_index].h_align) /
+ gst_droid_media_buffer_formats[format_index].bytes_per_pixel;
+ padded_height =
+ ALIGN_SIZE (height,
+ gst_droid_media_buffer_formats[format_index].v_align);
+ }
+ }
+
+ gst_video_info_set_format (&mem->video_info, format, padded_width,
+ padded_height);
+ mem->video_info.width = width;
+ mem->video_info.height = height;
+
+ gst_memory_init (GST_MEMORY_CAST (mem),
+ GST_MEMORY_FLAG_NO_SHARE, allocator, NULL, mem->video_info.size, 0, 0,
+ mem->video_info.size);
+
+ return mem;
+}
+
GstMemory *
gst_droid_media_buffer_allocator_alloc (GstAllocator * allocator,
DroidMediaBufferQueue * queue, DroidMediaBufferCallbacks * cb)
{
GstDroidMediaBufferMemory *mem;
+ DroidMediaBufferInfo info;
DroidMediaBuffer *buffer;
- gsize size;
+ int format_index;
if (!GST_IS_DROID_MEDIA_BUFFER_ALLOCATOR (allocator)) {
GST_WARNING_OBJECT (allocator,
@@ -115,23 +298,18 @@
return NULL;
}
- mem = g_slice_new0 (GstDroidMediaBufferMemory);
-
buffer = droid_media_buffer_queue_acquire_buffer (queue, cb);
if (!buffer) {
GST_ERROR_OBJECT (allocator, "failed to acquire media buffer");
- g_slice_free (GstDroidMediaBufferMemory, mem);
return NULL;
}
- mem->buffer = buffer;
+ droid_media_buffer_get_info (buffer, &info);
- /* This is not the correct size of the underlying buffer but there is no way to get that */
- size = sizeof (buffer);
+ format_index = gst_droid_media_buffer_index_of_hal_format (info.format);
- gst_memory_init (GST_MEMORY_CAST (mem),
- GST_MEMORY_FLAG_NO_SHARE | GST_MEMORY_FLAG_NOT_MAPPABLE, allocator, NULL,
- size, 0, 0, size);
+ mem = gst_droid_media_buffer_allocator_alloc_from_buffer (allocator, buffer,
+ format_index, info.width, info.height, info.stride);
GST_DEBUG_OBJECT (allocator, "alloc %p", mem);
@@ -144,8 +322,8 @@
{
GstDroidMediaBufferMemory *mem;
DroidMediaBuffer *buffer;
- int format;
- GstDroidMediaBufferAllocator *alloc;
+ DroidMediaBufferInfo droid_info;
+ int format_index;
if (!GST_IS_DROID_MEDIA_BUFFER_ALLOCATOR (allocator)) {
GST_WARNING_OBJECT (allocator,
@@ -153,36 +331,30 @@
return NULL;
}
- alloc = (GstDroidMediaBufferAllocator *) allocator;
+ format_index =
+ gst_droid_media_buffer_index_of_gst_format (info->finfo->format);
- if (info->finfo->format == GST_VIDEO_FORMAT_YV12) {
- format = alloc->c.HAL_PIXEL_FORMAT_YV12;
- } else if (info->finfo->format == GST_VIDEO_FORMAT_NV21) {
- format = alloc->c.HAL_PIXEL_FORMAT_YCrCb_420_SP;
- } else {
+ if (format_index == GST_DROID_MEDIA_BUFFER_FORMAT_COUNT) {
GST_WARNING_OBJECT (allocator,
"Unknown GStreamer format %s",
gst_video_format_to_string (info->finfo->format));
return NULL;
}
- mem = g_slice_new0 (GstDroidMediaBufferMemory);
-
buffer =
droid_media_buffer_create_from_raw_data (info->width, info->height,
GST_VIDEO_INFO_COMP_STRIDE (info, 0),
- GST_VIDEO_INFO_COMP_STRIDE (info, 1), format, data, cb);
+ GST_VIDEO_INFO_COMP_STRIDE (info, 1),
+ gst_droid_media_buffer_formats[format_index].hal_format, data, cb);
if (!buffer) {
GST_ERROR_OBJECT (allocator, "failed to acquire media buffer");
- g_slice_free (GstDroidMediaBufferMemory, mem);
return NULL;
}
- mem->buffer = buffer;
+ droid_media_buffer_get_info (buffer, &droid_info);
- gst_memory_init (GST_MEMORY_CAST (mem),
- GST_MEMORY_FLAG_NO_SHARE | GST_MEMORY_FLAG_NOT_MAPPABLE, allocator, NULL,
- 0, 0, 0, 0);
+ mem = gst_droid_media_buffer_allocator_alloc_from_buffer (allocator, buffer,
+ format_index, info->width, info->height, droid_info.stride);
GST_DEBUG_OBJECT (allocator, "alloc %p", mem);
@@ -220,3 +392,61 @@
return ((GstDroidMediaBufferMemory *) mem)->buffer;
}
+
+gpointer
+gst_droid_media_buffer_memory_map (GstMemory * mem, gsize maxsize,
+ GstMapFlags flags)
+{
+ GstDroidMediaBufferMemory *m = (GstDroidMediaBufferMemory *) mem;
+ int f = 0;
+
+ (void) maxsize;
+
+ if (flags & GST_MAP_READ) {
+ f |= DROID_MEDIA_BUFFER_LOCK_READ;
+ }
+ if (flags & GST_MAP_WRITE) {
+ f |= DROID_MEDIA_BUFFER_LOCK_WRITE;
+ }
+
+ if (m->map_count > 0) {
+ if (m->map_flags != f) {
+ GST_ERROR ("Tried to lock buffer with different flags");
+ return NULL;
+ }
+ } else {
+ m->map_data = droid_media_buffer_lock (m->buffer, f);
+
+ if (!m->map_data) {
+ GST_ERROR ("Tried to lock buffer with different flags");
+ return NULL;
+ }
+ }
+
+ m->map_flags = f;
+ m->map_count += 1;
+
+ return m->map_data;
+}
+
+void
+gst_droid_media_buffer_memory_unmap (GstMemory * mem)
+{
+ GstDroidMediaBufferMemory *m = (GstDroidMediaBufferMemory *) mem;
+
+ if (m->map_count > 0 && (m->map_count -= 1) == 0) {
+ m->map_data = NULL;
+ droid_media_buffer_unlock (m->buffer);
+ }
+}
+
+GstVideoInfo *
+gst_droid_media_buffer_get_video_info (GstMemory * mem)
+{
+ if (!gst_is_droid_media_buffer_memory (mem)) {
+ GST_ERROR ("memory %p is not droidmediabuffer memory", mem);
+ return NULL;
+ }
+
+ return &((GstDroidMediaBufferMemory *) mem)->video_info;
+}
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20190805.0.tar.gz/gst-libs/gst/droid/gstdroidmediabuffer.h
^
|
@@ -29,6 +29,8 @@
#define GST_ALLOCATOR_DROID_MEDIA_BUFFER "droidmediabuffer"
#define GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_BUFFER "memory:DroidMediaBuffer"
+#define GST_DROID_MEDIA_BUFFER_MEMORY_VIDEO_FORMATS "{ NV12_64Z32, YV12, NV16, " \
+ "NV12, NV21, YUY2, RGBA, RGBx, RGB, RGB16, BGRA, ENCODED }"
GstAllocator * gst_droid_media_buffer_allocator_new (void);
GstMemory * gst_droid_media_buffer_allocator_alloc (GstAllocator * allocator,
@@ -42,6 +44,8 @@
DroidMediaBuffer * gst_droid_media_buffer_memory_get_buffer (GstMemory * mem);
gboolean gst_is_droid_media_buffer_memory (GstMemory * mem);
+GstVideoInfo * gst_droid_media_buffer_get_video_info (GstMemory * mem);
+
G_END_DECLS
#endif /* __GST_DROID_MEDIA_BUFFER_H__ */
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20190805.0.tar.gz/gst/droidcamsrc/gstdroidcamsrc.c
^
|
@@ -52,7 +52,8 @@
GST_PAD_SRC,
GST_PAD_ALWAYS,
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
- (GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_BUFFER, "{YV12}") ";"
+ (GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_BUFFER,
+ GST_DROID_MEDIA_BUFFER_MEMORY_VIDEO_FORMATS) ";"
GST_VIDEO_CAPS_MAKE ("{NV21}")));
static GstStaticPadTemplate img_src_template_factory =
@@ -1049,6 +1050,37 @@
"Target bitrate", 0, G_MAXINT,
DEFAULT_TARGET_BITRATE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class,
+ PROP_SUPPORTED_WB_MODES,
+ g_param_spec_variant ("supported-wb-modes",
+ "Supported white balance modes", "Supported white balance modes",
+ G_VARIANT_TYPE_VARIANT, NULL, G_PARAM_READABLE));
+
+ g_object_class_install_property (gobject_class, PROP_SUPPORTED_COLOR_TONES,
+ g_param_spec_variant ("supported-color-tones", "Supported color tones",
+ "Supported color tones", G_VARIANT_TYPE_VARIANT, NULL,
+ G_PARAM_READABLE));
+
+ g_object_class_install_property (gobject_class, PROP_SUPPORTED_SCENE_MODES,
+ g_param_spec_variant ("supported-scene-modes",
+ "Supported scene modes", "Supported scene modes",
+ G_VARIANT_TYPE_VARIANT, NULL, G_PARAM_READABLE));
+
+ g_object_class_install_property (gobject_class, PROP_SUPPORTED_FLASH_MODES,
+ g_param_spec_variant ("supported-flash-modes", "Supported flash modes",
+ "Supported flash modes", G_VARIANT_TYPE_VARIANT, NULL,
+ G_PARAM_READABLE));
+
+ g_object_class_install_property (gobject_class, PROP_SUPPORTED_FOCUS_MODES,
+ g_param_spec_variant ("supported-focus-modes", "Supported focus modes",
+ "Supported focus modes", G_VARIANT_TYPE_VARIANT, NULL,
+ G_PARAM_READABLE));
+
+ g_object_class_install_property (gobject_class, PROP_SUPPORTED_ISO_SPEEDS,
+ g_param_spec_variant ("supported-iso-speeds", "Supported ISO speeds",
+ "Supported ISO speeds", G_VARIANT_TYPE_VARIANT, NULL,
+ G_PARAM_READABLE));
+
gst_droidcamsrc_photography_add_overrides (gobject_class);
/* Signals */
@@ -1424,7 +1456,9 @@
g_rec_mutex_lock (&src->dev_lock);
if (src->dev && src->dev->params) {
if (data == src->vfsrc) {
- caps = gst_droidcamsrc_params_get_viewfinder_caps (src->dev->params);
+ caps =
+ gst_droidcamsrc_params_get_viewfinder_caps (src->dev->params,
+ src->dev->viewfinder_format);
} else if (data == src->imgsrc) {
caps = gst_droidcamsrc_params_get_image_caps (src->dev->params);
} else if (data == src->vidsrc) {
@@ -1493,6 +1527,7 @@
gboolean ret = FALSE;
GstCaps *peer = NULL;
GstCaps *our_caps = NULL;
+ GstCapsFeatures *features;
gchar *preview;
GstVideoInfo info;
@@ -1500,7 +1535,9 @@
GST_DEBUG_OBJECT (src, "vfsrc negotiate");
- our_caps = gst_droidcamsrc_params_get_viewfinder_caps (src->dev->params);
+ our_caps =
+ gst_droidcamsrc_params_get_viewfinder_caps (src->dev->params,
+ src->dev->viewfinder_format);
GST_DEBUG_OBJECT (src, "our caps %" GST_PTR_FORMAT, our_caps);
if (!our_caps || gst_caps_is_empty (our_caps)) {
@@ -1559,8 +1596,12 @@
gst_droidcamsrc_params_set_string (src->dev->params, "preview-size", preview);
g_free (preview);
+ features = gst_caps_get_features (our_caps, 0);
+
g_rec_mutex_lock (&src->dev_lock);
- src->dev->use_raw_data = info.finfo->format == GST_VIDEO_FORMAT_NV21;
+ src->dev->use_raw_data =
+ !gst_caps_features_contains (features,
+ GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_BUFFER);
g_rec_mutex_unlock (&src->dev_lock);
ret = TRUE;
@@ -1713,8 +1754,8 @@
vid = g_strdup_printf ("%ix%i", info.width, info.height);
gchar *key =
- src->dev->
- params->has_separate_video_size_values ? "video-size" : "preview-size";
+ src->dev->params->
+ has_separate_video_size_values ? "video-size" : "preview-size";
gst_droidcamsrc_params_set_string (src->dev->params, key, vid);
/* Now we need to find a picture size that is equal to our video size.
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20190805.0.tar.gz/gst/droidcamsrc/gstdroidcamsrcdev.c
^
|
@@ -73,7 +73,7 @@
void gst_droidcamsrc_dev_update_params_locked (GstDroidCamSrcDev * dev);
static void
gst_droidcamsrc_dev_prepare_buffer (GstDroidCamSrcDev * dev, GstBuffer * buffer,
- DroidMediaRect rect, int width, int height, GstVideoFormat format);
+ DroidMediaRect rect, GstVideoInfo * video_info);
static gboolean
gst_droidcamsrc_dev_start_video_recording_recorder_locked (GstDroidCamSrcDev *
dev);
@@ -273,6 +273,7 @@
GstDroidCamSrcDev *dev = (GstDroidCamSrcDev *) user;
GstDroidCamSrc *src = GST_DROIDCAMSRC (GST_PAD_PARENT (dev->imgsrc->pad));
GstDroidCamSrcPad *pad = dev->vfsrc;
+ GstVideoInfo video_info;
GstBuffer *buffer;
gsize width, height;
DroidMediaRect rect;
@@ -298,8 +299,9 @@
rect = src->crop_rect;
GST_OBJECT_UNLOCK (src);
- gst_droidcamsrc_dev_prepare_buffer (dev, buffer, rect, width, height,
- GST_VIDEO_FORMAT_NV21);
+ gst_video_info_set_format (&video_info, GST_VIDEO_FORMAT_NV21, width, height);
+
+ gst_droidcamsrc_dev_prepare_buffer (dev, buffer, rect, &video_info);
g_mutex_lock (&pad->lock);
g_queue_push_tail (pad->queue, buffer);
@@ -433,7 +435,6 @@
DroidMediaBuffer *buffer;
GstMemory *mem;
DroidMediaRect rect;
- guint width, height;
GstBuffer *buff;
DroidMediaBufferCallbacks cb;
GstFlowReturn flow_ret;
@@ -482,11 +483,9 @@
gst_droidcamsrc_timestamp (src, buff);
rect = droid_media_buffer_get_crop_rect (buffer);
- width = droid_media_buffer_get_width (buffer);
- height = droid_media_buffer_get_height (buffer);
- gst_droidcamsrc_dev_prepare_buffer (dev, buff, rect, width, height,
- GST_VIDEO_FORMAT_YV12);
+ gst_droidcamsrc_dev_prepare_buffer (dev, buff, rect,
+ gst_droid_media_buffer_get_video_info (mem));
g_mutex_lock (&pad->lock);
g_queue_push_tail (pad->queue, buff);
@@ -541,6 +540,8 @@
droid_media_camera_constants_init (&dev->c);
+ dev->viewfinder_format = GST_VIDEO_FORMAT_UNKNOWN;
+
return dev;
}
@@ -548,6 +549,10 @@
gst_droidcamsrc_dev_open (GstDroidCamSrcDev * dev, GstDroidCamSrcCamInfo * info)
{
GstDroidCamSrc *src;
+ DroidMediaColourFormatConstants constants;
+ int hal_format;
+
+ droid_media_colour_format_constants_init (&constants);
g_rec_mutex_lock (dev->lock);
@@ -565,6 +570,23 @@
return FALSE;
}
+ hal_format = droid_media_camera_get_video_color_format (dev->cam);
+
+ if (hal_format == constants.OMX_COLOR_FormatYUV420Planar) {
+ dev->viewfinder_format = GST_VIDEO_FORMAT_YV12;
+ } else if (hal_format == constants.OMX_COLOR_FormatYUV422SemiPlanar) {
+ dev->viewfinder_format = GST_VIDEO_FORMAT_NV16;
+ } else if (hal_format == constants.OMX_COLOR_FormatYUV420SemiPlanar) {
+ dev->viewfinder_format = GST_VIDEO_FORMAT_NV21;
+ } else if (hal_format == constants.OMX_COLOR_FormatYCbYCr) {
+ dev->viewfinder_format = GST_VIDEO_FORMAT_YUY2;
+ } else if (hal_format == constants.OMX_COLOR_Format16bitRGB565) {
+ dev->viewfinder_format = GST_VIDEO_FORMAT_RGB16;
+ } else {
+ GST_WARNING_OBJECT (src, "Unknown HAL color format 0x%x", hal_format);
+ dev->viewfinder_format = GST_VIDEO_FORMAT_ENCODED;
+ }
+
dev->queue = droid_media_camera_get_buffer_queue (dev->cam);
if (!droid_media_camera_lock (dev->cam)) {
@@ -1115,7 +1137,7 @@
static void
gst_droidcamsrc_dev_prepare_buffer (GstDroidCamSrcDev * dev, GstBuffer * buffer,
- DroidMediaRect rect, int width, int height, GstVideoFormat format)
+ DroidMediaRect rect, GstVideoInfo * video_info)
{
GstDroidCamSrc *src = GST_DROIDCAMSRC (GST_PAD_PARENT (dev->imgsrc->pad));
GstVideoCropMeta *crop;
@@ -1133,11 +1155,13 @@
gst_buffer_add_gst_buffer_orientation_meta (buffer,
dev->info->orientation, dev->info->direction);
- gst_buffer_add_video_meta (buffer, GST_VIDEO_FRAME_FLAG_NONE,
- format, width, height);
+ gst_buffer_add_video_meta_full (buffer, GST_VIDEO_FRAME_FLAG_NONE,
+ video_info->finfo->format, video_info->width, video_info->height,
+ video_info->finfo->n_planes, video_info->offset, video_info->stride);
GST_LOG_OBJECT (src, "preview info: w=%d, h=%d, crop: x=%d, y=%d, w=%d, h=%d",
- width, height, crop->x, crop->y, crop->width, crop->height);
+ video_info->width, video_info->height, crop->x, crop->y, crop->width,
+ crop->height);
}
static gboolean
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20190805.0.tar.gz/gst/droidcamsrc/gstdroidcamsrcdev.h
^
|
@@ -54,6 +54,7 @@
GstDroidCamSrcVideoCaptureState *vid;
GstBufferPool *pool;
DroidMediaCameraConstants c;
+ GstVideoFormat viewfinder_format;
gboolean use_recorder;
GstDroidCamSrcRecorder *recorder;
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20190805.0.tar.gz/gst/droidcamsrc/gstdroidcamsrcparams.c
^
|
@@ -375,7 +375,8 @@
}
GstCaps *
-gst_droidcamsrc_params_get_viewfinder_caps (GstDroidCamSrcParams * params)
+gst_droidcamsrc_params_get_viewfinder_caps (GstDroidCamSrcParams * params,
+ GstVideoFormat format)
{
GstCaps *caps;
@@ -383,7 +384,8 @@
caps =
gst_caps_merge (gst_droidcamsrc_params_get_caps_locked (params,
"preview-size-values", "video/x-raw",
- GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_BUFFER, "YV12"),
+ GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_BUFFER,
+ gst_video_format_to_string (format)),
gst_droidcamsrc_params_get_caps_locked (params, "preview-size-values",
"video/x-raw", NULL, "NV21"));
g_mutex_unlock (¶ms->lock);
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20190805.0.tar.gz/gst/droidcamsrc/gstdroidcamsrcparams.h
^
|
@@ -22,6 +22,7 @@
#define __GST_DROIDCAMSRC_PARAMS_H__
#include <gst/gst.h>
+#include <gst/video/video.h>
G_BEGIN_DECLS
@@ -44,7 +45,7 @@
gchar *gst_droidcamsrc_params_to_string (GstDroidCamSrcParams *params);
gboolean gst_droidcamsrc_params_is_dirty (GstDroidCamSrcParams *params);
-GstCaps *gst_droidcamsrc_params_get_viewfinder_caps (GstDroidCamSrcParams *params);
+GstCaps *gst_droidcamsrc_params_get_viewfinder_caps (GstDroidCamSrcParams *params, GstVideoFormat format);
GstCaps *gst_droidcamsrc_params_get_video_caps (GstDroidCamSrcParams *params);
GstCaps *gst_droidcamsrc_params_get_image_caps (GstDroidCamSrcParams *params);
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20190805.0.tar.gz/gst/droidcamsrc/gstdroidcamsrcphotography.c
^
|
@@ -147,7 +147,8 @@
{GST_PHOTOGRAPHY_SCENE_MODE_LANDSCAPE, "landscape"},
{GST_PHOTOGRAPHY_SCENE_MODE_SPORT, "sports"},
{GST_PHOTOGRAPHY_SCENE_MODE_NIGHT, "night"},
- {GST_PHOTOGRAPHY_SCENE_MODE_AUTO, "auto"},
+ {GST_PHOTOGRAPHY_SCENE_MODE_MANUAL, "auto"},
+ {GST_PHOTOGRAPHY_SCENE_MODE_AUTO, "asd"},
{GST_PHOTOGRAPHY_SCENE_MODE_ACTION, "action"},
{GST_PHOTOGRAPHY_SCENE_MODE_NIGHT_PORTRAIT, "night-portrait"},
{GST_PHOTOGRAPHY_SCENE_MODE_THEATRE, "theatre"},
@@ -158,7 +159,11 @@
{GST_PHOTOGRAPHY_SCENE_MODE_FIREWORKS, "fireworks"},
{GST_PHOTOGRAPHY_SCENE_MODE_PARTY, "party"},
{GST_PHOTOGRAPHY_SCENE_MODE_CANDLELIGHT, "candlelight"},
- {GST_PHOTOGRAPHY_SCENE_MODE_BARCODE, "barcode"}
+ {GST_PHOTOGRAPHY_SCENE_MODE_BARCODE, "barcode"},
+ {GST_PHOTOGRAPHY_SCENE_MODE_BACKLIGHT, "backlight"},
+ {GST_PHOTOGRAPHY_SCENE_MODE_FLOWERS, "flowers"},
+ {GST_PHOTOGRAPHY_SCENE_MODE_AR, "AR"},
+ {GST_PHOTOGRAPHY_SCENE_MODE_HDR, "hdr"}
};
struct DataEntry ColourToneValues[] = {
@@ -175,6 +180,9 @@
{GST_PHOTOGRAPHY_COLOR_TONE_MODE_WHITEBOARD, "whiteboard"},
{GST_PHOTOGRAPHY_COLOR_TONE_MODE_BLACKBOARD, "blackboard"},
{GST_PHOTOGRAPHY_COLOR_TONE_MODE_AQUA, "aqua"},
+ {GST_PHOTOGRAPHY_COLOR_TONE_MODE_EMBOSS, "emboss"},
+ {GST_PHOTOGRAPHY_COLOR_TONE_MODE_SKETCH, "sketch"},
+ {GST_PHOTOGRAPHY_COLOR_TONE_MODE_NEON, "neon"}
};
struct DataEntry FlickerValues[] = {
@@ -319,6 +327,31 @@
capture_caps, user_data);
}
+GVariant *
+gst_droid_camsrc_glist_to_array (GList * list)
+{
+ int len = g_list_length (list);
+
+ if (len == 0) {
+ return 0;
+ }
+
+ GVariant *modes;
+ GVariantBuilder *builder;
+ builder = g_variant_builder_new (G_VARIANT_TYPE ("ai"));
+
+ struct DataEntry *entry;
+ GList *l;
+ for (l = list; l != NULL; l = l->next) {
+ entry = l->data;
+ g_variant_builder_add (builder, "i", entry->key);
+ }
+
+ modes = g_variant_new ("ai", builder);
+ g_variant_builder_unref (builder);
+ return modes;
+}
+
static void
gst_droidcamsrc_photography_set_autofocus (GstPhotography * photo, gboolean on)
{
@@ -599,6 +632,53 @@
{
/* not supported */
}
+
+ return TRUE;
+
+ case PROP_SUPPORTED_WB_MODES:
+ {
+ GVariant *wb_modes = gst_droid_camsrc_glist_to_array (src->photo->wb);
+ g_value_set_variant (value, wb_modes);
+ }
+ return TRUE;
+
+ case PROP_SUPPORTED_COLOR_TONES:
+ {
+ GVariant *effects =
+ gst_droid_camsrc_glist_to_array (src->photo->color_tone);
+ g_value_set_variant (value, effects);
+ }
+ return TRUE;
+
+ case PROP_SUPPORTED_SCENE_MODES:
+ {
+ GVariant *exposure_modes =
+ gst_droid_camsrc_glist_to_array (src->photo->scene);
+ g_value_set_variant (value, exposure_modes);
+ }
+ return TRUE;
+
+ case PROP_SUPPORTED_FLASH_MODES:
+ {
+ GVariant *flash_modes =
+ gst_droid_camsrc_glist_to_array (src->photo->flash);
+ g_value_set_variant (value, flash_modes);
+ }
+ return TRUE;
+
+ case PROP_SUPPORTED_FOCUS_MODES:
+ {
+ GVariant *focus_modes =
+ gst_droid_camsrc_glist_to_array (src->photo->focus);
+ g_value_set_variant (value, focus_modes);
+ }
+ return TRUE;
+
+ case PROP_SUPPORTED_ISO_SPEEDS:
+ {
+ GVariant *iso_modes = gst_droid_camsrc_glist_to_array (src->photo->iso);
+ g_value_set_variant (value, iso_modes);
+ }
return TRUE;
}
@@ -716,7 +796,7 @@
src->photo = g_slice_new0 (GstDroidCamSrcPhotography);
src->photo->settings.wb_mode = GST_PHOTOGRAPHY_WB_MODE_AUTO;
src->photo->settings.tone_mode = GST_PHOTOGRAPHY_COLOR_TONE_MODE_NORMAL;
- src->photo->settings.scene_mode = GST_PHOTOGRAPHY_SCENE_MODE_AUTO;
+ src->photo->settings.scene_mode = GST_PHOTOGRAPHY_SCENE_MODE_MANUAL;
src->photo->settings.flash_mode = GST_PHOTOGRAPHY_FLASH_MODE_AUTO;
src->photo->settings.ev_compensation = 0.0;
src->photo->settings.iso_speed = 0;
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20190805.0.tar.gz/gst/droidcamsrc/gstdroidcamsrcphotography.h
^
|
@@ -47,6 +47,12 @@
PROP_SENSOR_ORIENTATION,
PROP_SENSOR_MOUNT_ANGLE,
PROP_TARGET_BITRATE,
+ PROP_SUPPORTED_WB_MODES,
+ PROP_SUPPORTED_COLOR_TONES,
+ PROP_SUPPORTED_SCENE_MODES,
+ PROP_SUPPORTED_FLASH_MODES,
+ PROP_SUPPORTED_FOCUS_MODES,
+ PROP_SUPPORTED_ISO_SPEEDS,
/* photography interface */
PROP_WB_MODE,
@@ -70,7 +76,7 @@
PROP_MIN_EXPOSURE_TIME,
PROP_MAX_EXPOSURE_TIME,
PROP_NOISE_REDUCTION,
- PROP_EXPOSURE_MODE,
+ PROP_EXPOSURE_MODE
} GstDroidCamSrcProperties;
void gst_droidcamsrc_photography_register (gpointer g_iface, gpointer iface_data);
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20190805.0.tar.gz/gst/droidcodec/gstdroidvdec.c
^
|
@@ -45,12 +45,24 @@
GST_DEBUG_CATEGORY_EXTERN (gst_droid_vdec_debug);
#define GST_CAT_DEFAULT gst_droid_vdec_debug
+typedef struct
+{
+ int *hal_format;
+ GstVideoFormat gst_format;
+ GstDroidVideoConvertToI420 convert_to_i420;
+ gsize bytes_per_pixel;
+ gsize h_align;
+ gsize v_align;
+
+} GstDroidVideoFormatMap;
+
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_CAPS_FEATURE_MEMORY_DROID_MEDIA_BUFFER,
+ GST_DROID_MEDIA_BUFFER_MEMORY_VIDEO_FORMATS) ";"
GST_VIDEO_CAPS_MAKE ("I420")));
static gboolean gst_droidvdec_configure_state (GstVideoDecoder * decoder,
@@ -89,6 +101,179 @@
gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (GST_VIDEO_DECODER (dec)));
}
+
+static void
+gst_droidvec_copy_plane (guint8 * out, gint stride_out, guint8 * in,
+ gint stride_in, gint width, gint height)
+{
+ int i;
+ for (i = 0; i < height; i++) {
+ orc_memcpy (out, in, width);
+ out += stride_out;
+ in += stride_in;
+ }
+}
+
+static void
+gst_droidvec_copy_packed_planes (guint8 * out0, guint8 * out1, gint stride_out,
+ guint8 * in, gint stride_in, gint width, gint height)
+{
+ int x, y;
+ for (y = 0; y < height; y++) {
+ guint8 *row = in;
+ for (x = 0; x < width; x++) {
+ out0[x] = row[0];
+ out1[x] = row[1];
+ row += 2;
+ }
+
+ out0 += stride_out;
+ out1 += stride_out;
+ in += stride_in;
+ }
+}
+
+#define ALIGN_SIZE(size, to) (((size) + to - 1) & ~(to - 1))
+
+static gboolean
+gst_droidvdec_convert_native_to_i420 (GstDroidVDec * dec, GstMapInfo * out,
+ DroidMediaData * in, GstVideoInfo * info, gsize width, gsize height)
+{
+ gsize size = width * height * 3 / 2;
+ gboolean use_external_buffer = out->size != size;
+ guint8 *data = NULL;
+ gboolean ret = TRUE;
+
+ if (use_external_buffer) {
+ GST_DEBUG_OBJECT (dec, "using an external buffer for I420 conversion.");
+ data = g_malloc (size);
+ } else {
+ data = out->data;
+ }
+
+ if (droid_media_convert_to_i420 (dec->convert, in, data) != true) {
+ GST_ELEMENT_ERROR (dec, LIBRARY, FAILED, (NULL),
+ ("failed to convert frame"));
+
+ ret = FALSE;
+ } else if (use_external_buffer) {
+ /* fix up the buffer */
+ /* Code is based on gst-colorconv qcom backend */
+
+ gint stride = GST_VIDEO_INFO_COMP_STRIDE (info, 0);
+ gint strideUV = GST_VIDEO_INFO_COMP_STRIDE (info, 1);
+ guint8 *p = data;
+ guint8 *dst = out->data;
+ int i;
+ int x;
+
+ /* Y */
+ for (i = 0; i < info->height; i++) {
+ orc_memcpy (dst, p, info->width);
+ dst += stride;
+ p += width;
+ }
+
+ /* NOP if height == info->height */
+ p += (height - info->height) * width;
+ /* U and V */
+ for (x = 0; x < 2; x++) {
+ for (i = 0; i < info->height / 2; i++) {
+ orc_memcpy (dst, p, info->width / 2);
+ dst += strideUV;
+ p += width / 2;
+ }
+
+ /* NOP if height == info->height */
+ p += (height - info->height) / 2 * width / 2;
+ }
+ }
+
+ if (use_external_buffer && data) {
+ g_free (data);
+ }
+
+ return ret;
+}
+
+static gboolean
+gst_droidvdec_convert_yuv420_planar_to_i420 (GstDroidVDec * dec,
+ GstMapInfo * out, DroidMediaData * in, GstVideoInfo * info, gsize width,
+ gsize height)
+{
+ /* Buffer is already I420, so we can copy it straight over */
+ /* though we need to handle the cropping */
+
+ GST_DEBUG_OBJECT (dec, "Copying I420 buffer");
+ gint top = dec->crop_rect.top;
+ gint left = dec->crop_rect.left;
+ gint crop_width = dec->crop_rect.right - left;
+ gint crop_height = dec->crop_rect.bottom - top;
+
+ guint8 *y = in->data + (top * width) + left;
+ guint8 *u = in->data + (width * height) + (top * width / 2) + (left / 2);
+ guint8 *v =
+ in->data + (width * height) + (width * height / 4) +
+ (top * width / 2) + (left / 2);
+
+ gst_droidvec_copy_plane (out->data + info->offset[0],
+ info->stride[0], y, width, crop_width, crop_height);
+ gst_droidvec_copy_plane (out->data + info->offset[1],
+ info->stride[1], u, width / 2, crop_width / 2, crop_height / 2);
+ gst_droidvec_copy_plane (out->data + info->offset[2],
+ info->stride[2], v, width / 2, crop_width / 2, crop_height / 2);
+
+ return TRUE;
+}
+
+static gboolean
+gst_droidvdec_convert_yuv420_semi_planar_to_i420 (GstDroidVDec * dec,
+ GstMapInfo * out, DroidMediaData * in, GstVideoInfo * info, gsize width,
+ gsize height)
+{
+ GST_DEBUG_OBJECT (dec, "Converting from OMX_COLOR_FormatYUV420SemiPlanar");
+ gint stride = width;
+ gint slice_height = ALIGN_SIZE (height, 16);
+ gint top = dec->crop_rect.top;
+ gint left = dec->crop_rect.left;
+
+ guint8 *y = in->data + (top * stride) + left;
+ guint8 *uv = in->data + (stride * slice_height) + (top * stride / 2) + left;
+
+ gst_droidvec_copy_plane (out->data + info->offset[0],
+ info->stride[0], y, stride, info->width, info->height);
+ gst_droidvec_copy_packed_planes (out->data + info->offset[1],
+ out->data + info->offset[2], info->stride[1], uv, stride,
+ info->width / 2, info->height / 2);
+
+ return TRUE;
+}
+
+static gboolean
+gst_droidvdec_convert_yuv420_packed_semi_planar_to_i420 (GstDroidVDec * dec,
+ GstMapInfo * out, DroidMediaData * in, GstVideoInfo * info, gsize width,
+ gsize height)
+{
+ /* copy to the output buffer swapping the u and v planes and cropping if necessary */
+ /* NV12 format with 128 byte alignment */
+ GST_DEBUG_OBJECT (dec, "Converting from qcom NV12 semi planar");
+ gint stride = ALIGN_SIZE (width, 128);
+ gint slice_height = ALIGN_SIZE (height, 32);
+ gint top = ALIGN_SIZE (dec->crop_rect.top, 2);
+ gint left = ALIGN_SIZE (dec->crop_rect.left, 2);
+
+ guint8 *y = in->data + (top * stride) + left;
+ guint8 *uv = in->data + (stride * slice_height) + (top * stride / 2) + left;
+
+ gst_droidvec_copy_plane (out->data + info->offset[0],
+ info->stride[0], y, stride, info->width, info->height);
+ gst_droidvec_copy_packed_planes (out->data + info->offset[1],
+ out->data + info->offset[2], info->stride[1], uv, stride,
+ info->width / 2, info->height / 2);
+
+ return TRUE;
+}
+
static gboolean
gst_droidvdec_create_codec (GstDroidVDec * dec, GstBuffer * input)
{
@@ -133,7 +318,7 @@
DROID_MEDIA_CODEC_HW_ONLY | DROID_MEDIA_CODEC_USE_EXTERNAL_LOOP;
md.codec_data.size = 0;
- if (dec->format == GST_VIDEO_FORMAT_I420) {
+ if (!dec->use_hardware_buffers) {
md.parent.flags |= DROID_MEDIA_CODEC_NO_MEDIA_BUFFER;
}
@@ -216,49 +401,12 @@
GST_FIXME ("Not sure what to do here really");
}
-static void
-gst_droidvec_copy_plane (guint8 * out, gint stride_out, guint8 * in,
- gint stride_in, gint width, gint height)
-{
- int i;
- for (i = 0; i < height; i++) {
- orc_memcpy (out, in, width);
- out += stride_out;
- in += stride_in;
- }
-}
-
-static void
-gst_droidvec_copy_packed_planes (guint8 * out0, guint8 * out1, gint stride_out,
- guint8 * in, gint stride_in, gint width, gint height)
-{
- int x, y;
- for (y = 0; y < height; y++) {
- guint8 *row = in;
- for (x = 0; x < width; x++) {
- out0[x] = row[0];
- out1[x] = row[1];
- row += 2;
- }
-
- out0 += stride_out;
- out1 += stride_out;
- in += stride_in;
- }
-}
-
-#define ALIGN_SIZE(size, to) (((size) + to - 1) & ~(to - 1))
-
static gboolean
gst_droidvdec_convert_buffer (GstDroidVDec * dec,
GstBuffer * out, DroidMediaData * in, GstVideoInfo * info)
{
gsize height = info->height;
gsize width = info->width;
- gsize size;
- gboolean use_droid_convert;
- gboolean use_external_buffer;
- guint8 *data = NULL;
gboolean ret;
GstMapInfo map_info;
@@ -274,149 +422,15 @@
GST_INFO_OBJECT (dec, "using codec supplied height %d", height);
}
- size = width * height * 3 / 2;
- use_droid_convert = dec->convert;
- use_external_buffer = use_droid_convert && gst_buffer_get_size (out) != size;
- map_info.data = NULL;
-
- if (dec->codec_type->quirks & DONT_USE_DROID_CONVERT_VALUE) {
- use_droid_convert = false;
- GST_INFO_OBJECT (dec, "not using droid convert binary");
- }
-
- if (!gst_buffer_map (out, &map_info, GST_MAP_WRITE)) {
+ if (!dec->convert_to_i420) {
+ GST_ERROR_OBJECT (dec, "no i420 conversion function");
+ ret = FALSE;
+ } else if (!gst_buffer_map (out, &map_info, GST_MAP_WRITE)) {
GST_ERROR_OBJECT (dec, "failed to map buffer");
ret = FALSE;
- goto out;
- }
-
- if (use_droid_convert) {
- if (use_external_buffer) {
- GST_DEBUG_OBJECT (dec, "using an external buffer for I420 conversion.");
- data = g_malloc (size);
- } else {
- data = map_info.data;
- }
-
- if (droid_media_convert_to_i420 (dec->convert, in, data) != true) {
- GST_ELEMENT_ERROR (dec, LIBRARY, FAILED, (NULL),
- ("failed to convert frame"));
-
- ret = FALSE;
- goto out;
- }
-
- if (use_external_buffer) {
- /* fix up the buffer */
- /* Code is based on gst-colorconv qcom backend */
-
- gint stride = GST_VIDEO_INFO_COMP_STRIDE (info, 0);
- gint strideUV = GST_VIDEO_INFO_COMP_STRIDE (info, 1);
- guint8 *p = data;
- guint8 *dst = map_info.data;
- int i;
- int x;
-
- /* Y */
- for (i = 0; i < info->height; i++) {
- orc_memcpy (dst, p, info->width);
- dst += stride;
- p += width;
- }
-
- /* NOP if height == info->height */
- p += (height - info->height) * width;
- /* U and V */
- for (x = 0; x < 2; x++) {
- for (i = 0; i < info->height / 2; i++) {
- orc_memcpy (dst, p, info->width / 2);
- dst += strideUV;
- p += width / 2;
- }
-
- /* NOP if height == info->height */
- p += (height - info->height) / 2 * width / 2;
- }
- }
} else {
- DroidMediaColourFormatConstants c;
- droid_media_colour_format_constants_init (&c);
- if (dec->hal_format == c.OMX_COLOR_FormatYUV420Planar) {
- /* Buffer is already I420, so we can copy it straight over */
- /* though we need to handle the cropping */
-
- GST_DEBUG_OBJECT (dec, "Copying I420 buffer");
- gint top = dec->crop_rect.top;
- gint left = dec->crop_rect.left;
- gint crop_width = dec->crop_rect.right - left;
- gint crop_height = dec->crop_rect.bottom - top;
-
- guint8 *y = in->data + (top * width) + left;
- guint8 *u = in->data + (width * height) + (top * width / 2) + (left / 2);
- guint8 *v =
- in->data + (width * height) + (width * height / 4) +
- (top * width / 2) + (left / 2);
-
- gst_droidvec_copy_plane (map_info.data + info->offset[0],
- info->stride[0], y, width, crop_width, crop_height);
- gst_droidvec_copy_plane (map_info.data + info->offset[1],
- info->stride[1], u, width / 2, crop_width / 2, crop_height / 2);
- gst_droidvec_copy_plane (map_info.data + info->offset[2],
- info->stride[2], v, width / 2, crop_width / 2, crop_height / 2);
-
- } else if (dec->hal_format == c.QOMX_COLOR_FormatYUV420PackedSemiPlanar32m) {
- /* copy to the output buffer swapping the u and v planes and cropping if necessary */
- /* NV12 format with 128 byte alignment */
- GST_DEBUG_OBJECT (dec, "Converting from qcom NV12 semi planar");
- gint stride = ALIGN_SIZE (width, 128);
- gint slice_height = ALIGN_SIZE (height, 32);
- gint top = ALIGN_SIZE (dec->crop_rect.top, 2);
- gint left = ALIGN_SIZE (dec->crop_rect.left, 2);
-
- guint8 *y = in->data + (top * stride) + left;
- guint8 *uv =
- in->data + (stride * slice_height) + (top * stride / 2) + left;
-
- gst_droidvec_copy_plane (map_info.data + info->offset[0],
- info->stride[0], y, stride, info->width, info->height);
- gst_droidvec_copy_packed_planes (map_info.data + info->offset[1],
- map_info.data + info->offset[2], info->stride[1], uv, stride,
- info->width / 2, info->height / 2);
-
- } else if (dec->hal_format == c.OMX_COLOR_FormatYUV420SemiPlanar) {
- GST_DEBUG_OBJECT (dec,
- "Converting from OMX_COLOR_FormatYUV420SemiPlanar");
- gint stride = width;
- gint slice_height = ALIGN_SIZE (height, 16);
- gint top = dec->crop_rect.top;
- gint left = dec->crop_rect.left;
-
- guint8 *y = in->data + (top * stride) + left;
- guint8 *uv =
- in->data + (stride * slice_height) + (top * stride / 2) + left;
-
- gst_droidvec_copy_plane (map_info.data + info->offset[0],
- info->stride[0], y, stride, info->width, info->height);
- gst_droidvec_copy_packed_planes (map_info.data + info->offset[1],
- map_info.data + info->offset[2], info->stride[1], uv, stride,
- info->width / 2, info->height / 2);
+ ret = dec->convert_to_i420 (dec, &map_info, in, info, width, height);
- } else {
- GST_ELEMENT_ERROR (dec, LIBRARY, FAILED, (NULL),
- ("Unknown codec colour format: %d", dec->hal_format));
- ret = FALSE;
- goto out;
- }
- }
-
- ret = TRUE;
-
-out:
- if (use_external_buffer && data) {
- g_free (data);
- }
-
- if (map_info.data) {
gst_buffer_unmap (out, &map_info);
}
@@ -433,11 +447,11 @@
GstVideoCodecFrame *frame;
DroidMediaBuffer *buffer;
GstBuffer *buff;
- DroidMediaRect rect;
GstVideoCropMeta *crop_meta;
DroidMediaBufferCallbacks cb;
+ DroidMediaBufferInfo droid_info;
+ GstVideoInfo video_info;
GstFlowReturn flow_ret;
- int64_t ts;
GST_DEBUG_OBJECT (dec, "frame available");
@@ -477,16 +491,14 @@
}
buffer = gst_droid_media_buffer_memory_get_buffer (mem);
- width = droid_media_buffer_get_width (buffer);
- height = droid_media_buffer_get_height (buffer);
- rect = droid_media_buffer_get_crop_rect (buffer);
- ts = droid_media_buffer_get_timestamp (buffer);
+ droid_media_buffer_get_info (buffer, &droid_info);
gst_buffer_insert_memory (buff, 0, mem);
/* Now we can configure the state */
if (G_UNLIKELY (!dec->out_state)) {
- if (!gst_droidvdec_configure_state (decoder, width, height)) {
+ if (!gst_droidvdec_configure_state (decoder, droid_info.width,
+ droid_info.height)) {
dec->downstream_flow_ret = GST_FLOW_ERROR;
gst_buffer_unref (buff);
GST_VIDEO_DECODER_STREAM_UNLOCK (decoder);
@@ -498,17 +510,29 @@
mem = NULL;
buffer = NULL;
+ if (dec->bytes_per_pixel != 0) {
+ width = ALIGN_SIZE (droid_info.stride, dec->h_align) / dec->bytes_per_pixel;
+ height = ALIGN_SIZE (droid_info.height, dec->v_align);
+ } else {
+ width = droid_info.width;
+ height = droid_info.height;
+ }
+
+ gst_video_info_set_format (&video_info, dec->format, width, height);
+
+
crop_meta = gst_buffer_add_video_crop_meta (buff);
- crop_meta->x = rect.left;
- crop_meta->y = rect.top;
- crop_meta->width = rect.right - rect.left;
- crop_meta->height = rect.bottom - rect.top;
+ crop_meta->x = droid_info.crop_rect.left;
+ crop_meta->y = droid_info.crop_rect.top;
+ crop_meta->width = droid_info.crop_rect.right - droid_info.crop_rect.left;
+ crop_meta->height = droid_info.crop_rect.bottom - droid_info.crop_rect.top;
GST_LOG_OBJECT (dec, "crop info: x=%d, y=%d, w=%d, h=%d", crop_meta->x,
crop_meta->y, crop_meta->width, crop_meta->height);
- gst_buffer_add_video_meta (buff, GST_VIDEO_FRAME_FLAG_NONE,
- GST_VIDEO_FORMAT_YV12, width, height);
+ gst_buffer_add_video_meta_full (buff, GST_VIDEO_FRAME_FLAG_NONE, dec->format,
+ droid_info.width, droid_info.height, video_info.finfo->n_planes,
+ video_info.offset, video_info.stride);
frame = gst_video_decoder_get_oldest_frame (decoder);
@@ -523,7 +547,7 @@
frame->output_buffer = buff;
/* We get the timestamp in ns already */
- frame->pts = ts;
+ frame->pts = droid_info.timestamp;
/* we have a ref acquired by _get_oldest_frame()
* but we don't drop it because _finish_frame() assumes 2 refs.
@@ -726,10 +750,49 @@
GstDroidVDec *dec = GST_DROIDVDEC (decoder);
DroidMediaCodecMetaData md;
DroidMediaRect rect;
+ DroidMediaColourFormatConstants constants;
+ int format_index, format_count;
+
+ const GstDroidVideoFormatMap formats[] = {
+ {&constants.QOMX_COLOR_FormatYUV420PackedSemiPlanar32m,
+ GST_VIDEO_FORMAT_NV12,
+ gst_droidvdec_convert_yuv420_packed_semi_planar_to_i420, 1, 128, 32},
+ {&constants.QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka,
+ GST_VIDEO_FORMAT_NV12_64Z32, NULL, 0, 0, 0},
+ {&constants.OMX_COLOR_FormatYUV420Planar, GST_VIDEO_FORMAT_I420,
+ gst_droidvdec_convert_yuv420_planar_to_i420, 1, 4, 1},
+ {&constants.OMX_COLOR_FormatYUV420PackedPlanar, GST_VIDEO_FORMAT_I420, NULL,
+ 1, 1, 1},
+ {&constants.OMX_COLOR_FormatYUV420SemiPlanar, GST_VIDEO_FORMAT_NV12,
+ gst_droidvdec_convert_yuv420_semi_planar_to_i420, 1, 1, 1},
+ {&constants.OMX_COLOR_FormatL8, GST_VIDEO_FORMAT_GRAY8, NULL, 1, 1, 1},
+ {&constants.OMX_COLOR_FormatYUV422SemiPlanar, GST_VIDEO_FORMAT_NV16, NULL,
+ 1, 1, 1},
+ {&constants.OMX_COLOR_FormatYCbYCr, GST_VIDEO_FORMAT_YUY2, NULL, 1, 1, 1},
+ {&constants.OMX_COLOR_FormatYCrYCb, GST_VIDEO_FORMAT_YVYU, NULL, 1, 1, 1},
+ {&constants.OMX_COLOR_FormatCbYCrY, GST_VIDEO_FORMAT_UYVY, NULL, 1, 1, 1},
+ {&constants.OMX_COLOR_Format32bitARGB8888,
+ /* There is a mismatch in omxil specification 4.2.1 between
+ * OMX_COLOR_Format32bitARGB8888 and its description
+ * Follow the description */
+ GST_VIDEO_FORMAT_ABGR,
+ NULL,
+ 4, 4, 1},
+ {&constants.OMX_COLOR_Format32bitBGRA8888,
+ /* Same issue as OMX_COLOR_Format32bitARGB8888 */
+ GST_VIDEO_FORMAT_ARGB,
+ NULL,
+ 4, 4, 1},
+ {&constants.OMX_COLOR_Format16bitRGB565, GST_VIDEO_FORMAT_RGB16, NULL, 2, 4,
+ 1},
+ {&constants.OMX_COLOR_Format16bitBGR565, GST_VIDEO_FORMAT_BGR16, NULL, 2, 4,
+ 1}
+ };
memset (&md, 0x0, sizeof (md));
memset (&rect, 0x0, sizeof (rect));
+ droid_media_colour_format_constants_init (&constants);
droid_media_codec_get_output_info (dec->codec, &md, &rect);
GST_INFO_OBJECT (dec,
@@ -741,9 +804,59 @@
dec->codec_reported_width = md.width;
dec->hal_format = md.hal_format;
- if (dec->format == GST_VIDEO_FORMAT_I420) {
- width = rect.right - rect.left;
- height = rect.bottom - rect.top;
+ if (!dec->use_hardware_buffers && !dec->convert) {
+ if (dec->codec_type->quirks & DONT_USE_DROID_CONVERT_VALUE) {
+ GST_INFO_OBJECT (dec, "not using droid convert binary");
+ } else {
+ dec->convert = droid_media_convert_create ();
+ }
+ }
+
+ format_count = sizeof (formats) / sizeof (formats[0]);
+ for (format_index = 0; format_index < format_count; ++format_index) {
+ if (*formats[format_index].hal_format == md.hal_format) {
+ break;
+ }
+ }
+
+ if (dec->use_hardware_buffers) {
+ if (format_index < format_count) {
+ dec->format = formats[format_index].gst_format;
+ dec->bytes_per_pixel = formats[format_index].bytes_per_pixel;
+ dec->h_align = formats[format_index].h_align;
+ dec->v_align = formats[format_index].v_align;
+ } else {
+ GST_INFO_OBJECT (dec, "The HAL codec format 0x%x is unrecognized",
+ md.hal_format);
+ /* This should be GST_VIDEO_FORMAT_ENCODED but the videoconv? element
+ can't do passthrough of that format. Since the format can't be
+ identified the reported size of the buffer will be zero and it
+ won't be possible to map it so reporting the wrong format should
+ be harmless. */
+ dec->format = GST_VIDEO_FORMAT_YV12;
+ dec->bytes_per_pixel = 0;
+ dec->h_align = 0;
+ dec->v_align = 0;
+ }
+ } else {
+ if (dec->convert) {
+ dec->convert_to_i420 = gst_droidvdec_convert_native_to_i420;
+ } else if (format_index < format_count) {
+ dec->convert_to_i420 = formats[format_index].convert_to_i420;
+ } else {
+ dec->convert_to_i420 = NULL;
+ }
+
+ if (dec->convert_to_i420) {
+ dec->format = GST_VIDEO_FORMAT_I420;
+
+ width = rect.right - rect.left;
+ height = rect.bottom - rect.top;
+ } else {
+ GST_ELEMENT_ERROR (dec, STREAM, FORMAT, (NULL),
+ ("HAL codec format 0x%x is unsupported", md.hal_format));
+ goto error;
+ }
}
GST_INFO_OBJECT (dec, "configuring state: width=%d, height=%d", width,
@@ -756,16 +869,13 @@
g_assert (dec->out_state->caps == NULL);
dec->out_state->caps = gst_video_info_to_caps (&dec->out_state->info);
- if (dec->out_state->info.finfo->format == GST_VIDEO_FORMAT_YV12) {
+ if (dec->use_hardware_buffers) {
GstCapsFeatures *feature =
gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_BUFFER,
NULL);
gst_caps_set_features (dec->out_state->caps, 0, feature);
} else {
memcpy (&dec->crop_rect, &rect, sizeof (rect));
- if (!dec->convert) {
- dec->convert = droid_media_convert_create ();
- }
if (dec->convert) {
droid_media_convert_set_crop_rect (dec->convert, rect, md.width,
@@ -935,8 +1045,8 @@
{
GstDroidVDec *dec = GST_DROIDVDEC (decoder);
GstCaps *caps, *template_caps;
- GstStructure *s;
- const gchar *format;
+ GstCapsFeatures *features;
+ guint i, count;
/*
* destroying the droidmedia codec here will cause stagefright to call abort.
@@ -971,15 +1081,20 @@
GST_DEBUG_OBJECT (dec, "peer caps %" GST_PTR_FORMAT, caps);
- caps = gst_caps_truncate (caps);
- caps = gst_caps_fixate (caps);
+ dec->use_hardware_buffers = FALSE;
+
+ count = gst_caps_get_size (caps);
+ for (i = 0; i < count; ++i) {
+ features = gst_caps_get_features (caps, i);
+ if (gst_caps_features_contains
+ (features, GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_BUFFER)) {
+ dec->use_hardware_buffers = TRUE;
+ }
+ }
- s = gst_caps_get_structure (caps, 0);
- format = gst_structure_get_string (s, "format");
- dec->format = gst_video_format_from_string (format);
gst_caps_unref (caps);
- if (G_UNLIKELY (format == GST_VIDEO_FORMAT_UNKNOWN)) {
+ if (G_UNLIKELY (count == 0)) {
GST_ELEMENT_ERROR (dec, STREAM, FORMAT, (NULL), ("Failed to parse caps"));
return FALSE;
}
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20190805.0.tar.gz/gst/droidcodec/gstdroidvdec.h
^
|
@@ -44,6 +44,10 @@
typedef struct _GstDroidVDecClass GstDroidVDecClass;
typedef enum _GstDroidVDecState GstDroidVDecState;
+typedef gboolean (*GstDroidVideoConvertToI420) (GstDroidVDec * dec,
+ GstMapInfo * out, DroidMediaData * in, GstVideoInfo * info, gsize width,
+ gsize height);
+
enum _GstDroidVDecState
{
GST_DROID_VDEC_STATE_OK,
@@ -73,14 +77,19 @@
gboolean dirty;
DroidMediaRect crop_rect;
gboolean running;
+ gboolean use_hardware_buffers;
GstVideoFormat format;
gsize codec_reported_height;
gsize codec_reported_width;
+ gsize bytes_per_pixel;
+ gsize v_align;
+ gsize h_align;
GstVideoCodecState *in_state;
GstVideoCodecState *out_state;
DroidMediaConvert *convert;
+ GstDroidVideoConvertToI420 convert_to_i420;
gint32 hal_format;
};
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20190805.0.tar.gz/gst/droideglsink/gstdroideglsink.c
^
|
@@ -43,9 +43,10 @@
GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{YV12, NV21}") "; "
- GST_VIDEO_CAPS_MAKE_WITH_FEATURES
- (GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_BUFFER, "{YV12}")));
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
+ (GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_BUFFER,
+ GST_DROID_MEDIA_BUFFER_MEMORY_VIDEO_FORMATS) "; "
+ GST_VIDEO_CAPS_MAKE ("{YV12, NV21}")));
enum
{
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20190805.0.tar.gz/tools/gstdroidcamsrcconf.c
^
|
@@ -84,13 +84,13 @@
{NULL, -1}
}},
{"scene-mode-values", "scene-mode", {
- ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_MANUAL, NULL),
+ ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_MANUAL, "auto"),
ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_CLOSEUP, NULL),
ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_PORTRAIT, "portrait"),
ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_LANDSCAPE, "landscape"),
ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_SPORT, "sports"),
ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_NIGHT, "night"),
- ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_AUTO, "auto"),
+ ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_AUTO, "asd"),
ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_ACTION, "action"),
ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_NIGHT_PORTRAIT, "night-portrait"),
ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_THEATRE, "theatre"),
@@ -102,6 +102,10 @@
ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_PARTY, "party"),
ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_CANDLELIGHT, "candlelight"),
ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_BARCODE, "barcode"),
+ ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_BACKLIGHT, "backlight"),
+ ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_FLOWERS, "flowers"),
+ ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_AR, "AR"),
+ ADD_ENTRY (GST_PHOTOGRAPHY_SCENE_MODE_HDR, "hdr"),
{NULL, -1}
}},
{"effect-values", "color-tone-mode", {
@@ -121,6 +125,9 @@
ADD_ENTRY (GST_PHOTOGRAPHY_COLOR_TONE_MODE_WHITEBOARD, "whiteboard"),
ADD_ENTRY (GST_PHOTOGRAPHY_COLOR_TONE_MODE_BLACKBOARD, "blackboard"),
ADD_ENTRY (GST_PHOTOGRAPHY_COLOR_TONE_MODE_AQUA, "aqua"),
+ ADD_ENTRY (GST_PHOTOGRAPHY_COLOR_TONE_MODE_EMBOSS, "emboss"),
+ ADD_ENTRY (GST_PHOTOGRAPHY_COLOR_TONE_MODE_SKETCH, "sketch"),
+ ADD_ENTRY (GST_PHOTOGRAPHY_COLOR_TONE_MODE_NEON, "neon"),
{NULL, -1}
}},
// Qualcomm ISO values (e.g. ISO100) and Intel (iso-100)
|