[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:gst-droid.spec
^
|
|
[-]
[+]
|
Changed |
_service
^
|
@@ -6,7 +6,7 @@
<service name="tar_git">
<param name="url">https://github.com/sailfishos/gst-droid.git</param>
<param name="branch">master</param>
- <param name="revision">3f0ffc0573d267841d7194a2badadb2a4d075c16</param>
+ <param name="revision">58a75f0607878cff85c0ea93bd48367c56c1e6a7</param>
<param name="token"/>
<param name="debian">N</param>
<param name="dumb">N</param>
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20181120.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;
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20181120.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.20181120.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 =
@@ -1424,7 +1425,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 +1496,7 @@
gboolean ret = FALSE;
GstCaps *peer = NULL;
GstCaps *our_caps = NULL;
+ GstCapsFeatures *features;
gchar *preview;
GstVideoInfo info;
@@ -1500,7 +1504,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 +1565,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;
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20181120.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);
@@ -558,6 +563,22 @@
dev->info = info;
dev->cam = droid_media_camera_connect (dev->info->num);
+ hal_format = droid_media_camera_get_video_color_format (dev->cam);
+
+ if (hal_format == constants.OMX_COLOR_FormatYUV420Planar) {
+ dev->viewfinder_format = GST_VIDEO_FORMAT_I420;
+ } 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 {
+ dev->viewfinder_format = GST_VIDEO_FORMAT_ENCODED;
+ }
+
if (!dev->cam) {
g_rec_mutex_unlock (dev->lock);
@@ -1115,7 +1136,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 +1154,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.20181120.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.20181120.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.20181120.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.20181120.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);
+
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20181120.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.20181120.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
{
|