static void __mmplayer_copy_uri_and_set_type(MMPlayerParseProfile* data, const char *uri, int uri_type);
static int __mmplayer_set_mem_uri(MMPlayerParseProfile* data, char *path, void *param);
static int __mmplayer_set_file_uri(MMPlayerParseProfile* data, const char *uri);
+
+static MMPlayerVideoStreamDataType* __mmplayer_create_stream_from_pad(GstPad *pad);
+static void __mmplayer_zerocopy_set_stride_elevation_bo(MMPlayerVideoStreamDataType *stream, GstMemory *mem);
+static gboolean __mmplayer_swcodec_set_stride_elevation(MMPlayerVideoStreamDataType *stream);
+static gboolean __mmplayer_swcodec_set_bo(mm_player_t *player, MMPlayerVideoStreamDataType *stream, GstMemory *mem);
/*===========================================================================================
| |
| FUNCTION DEFINITIONS |
__mmplayer_video_stream_decoded_render_cb(GstElement* object, GstBuffer *buffer, GstPad *pad, gpointer data)
{
mm_player_t* player = (mm_player_t*)data;
- GstCaps *caps = NULL;
MMPlayerVideoStreamDataType *stream = NULL;
- tbm_surface_h surface;
GstMemory *mem = NULL;
- GstMapInfo mapinfo = GST_MAP_INFO_INIT;
- GstStructure *structure = NULL;
- const gchar *string_format = NULL;
- unsigned int fourcc = 0;
- unsigned int pitch = 0;
- int index = 0;
MMPLAYER_FENTER();
- MMPLAYER_RETURN_IF_FAIL(player && player->video_stream_cb);
+ MMPLAYER_RETURN_IF_FAIL(player);
+ MMPLAYER_RETURN_IF_FAIL(player->video_stream_cb);
if (player->video_stream_prerolled) {
player->video_stream_prerolled = FALSE;
return;
}
- caps = gst_pad_get_current_caps(pad);
- if (caps == NULL) {
- LOGE("Caps is NULL.");
- return;
- }
-
- /* MMPLAYER_LOG_GST_CAPS_TYPE(caps); */
-
/* clear stream data structure */
- stream = (MMPlayerVideoStreamDataType *)g_malloc0(sizeof(MMPlayerVideoStreamDataType));
+ stream = __mmplayer_create_stream_from_pad(pad);
if (!stream) {
- LOGE("failed to alloc mem for video data");
+ LOGE("failed to alloc stream");
return;
}
- structure = gst_caps_get_structure(caps, 0);
- gst_structure_get_int(structure, "width", &(stream->width));
- gst_structure_get_int(structure, "height", &(stream->height));
- string_format = gst_structure_get_string(structure, "format");
- if (string_format)
- fourcc = _mmplayer_convert_fourcc_string_to_value(string_format);
- stream->format = util_get_pixtype(fourcc);
- gst_caps_unref(caps);
- caps = NULL;
-
__mmplayer_get_video_angle(player, NULL, &stream->orientation);
- /*
- LOGD("Call video steramCb, data[%p], Width[%d],Height[%d], Format[%d]",
- GST_BUFFER_DATA(buffer), stream.width, stream.height, stream.format);
- */
-
- if (stream->width == 0 || stream->height == 0 || stream->format == MM_PIXEL_FORMAT_INVALID) {
- LOGE("Wrong condition!!");
- goto ERROR;
- }
-
/* set size and timestamp */
mem = gst_buffer_peek_memory(buffer, 0);
stream->length_total = gst_memory_get_sizes(mem, NULL, NULL);
stream->timestamp = (unsigned int)(GST_TIME_AS_MSECONDS(GST_BUFFER_PTS(buffer))); /* nano sec -> mili sec */
- surface = gst_tizen_memory_get_surface(mem);
/* check zero-copy */
if (player->set_mode.video_zc &&
player->set_mode.media_packet_video_stream &&
gst_is_tizen_memory(mem)) {
- for (index = 0; index < gst_tizen_memory_get_num_bos(mem); index++) {
- tbm_surface_internal_get_plane_data(surface, index, NULL, NULL, &pitch);
- stream->bo[index] = tbm_bo_ref(gst_tizen_memory_get_bos(mem, index));
- stream->stride[index] = pitch;
- stream->elevation[index] = stream->height;
- }
+ __mmplayer_zerocopy_set_stride_elevation_bo(stream, mem);
stream->internal_buffer = gst_buffer_ref(buffer);
} else { /* sw codec */
- int i = 0;
- int j = 0;
- int k = 0;
- int ret = TBM_SURFACE_ERROR_NONE;
- int src_stride[MM_PLAYER_IMGB_MPLANE_MAX] = { 0, };
- int src_offset[MM_PLAYER_IMGB_MPLANE_MAX] = { 0, };
- int size = 0;
- unsigned char *src = NULL;
- unsigned char *dest = NULL;
- tbm_bo_handle thandle;
- tbm_surface_h surface;
- tbm_surface_info_s info;
- gboolean gst_ret;
-
- gst_ret = gst_memory_map(mem, &mapinfo, GST_MAP_READWRITE);
- if (!gst_ret) {
- LOGE("fail to gst_memory_map");
- goto ERROR;
- }
-
-
- if (stream->format == MM_PIXEL_FORMAT_I420) {
- surface = tbm_surface_create(stream->width, stream->height, TBM_FORMAT_YUV420);
-
- ret = tbm_surface_get_info(surface, &info);
-
- if (ret != TBM_SURFACE_ERROR_NONE) {
- tbm_surface_destroy(surface);
- goto ERROR;
- }
- tbm_surface_destroy(surface);
-
- src_stride[0] = GST_ROUND_UP_4(stream->width);
- src_stride[1] = src_stride[2] = GST_ROUND_UP_4(stream->width>>1);
- src_offset[1] = src_stride[0] * GST_ROUND_UP_2(stream->height);
- src_offset[2] = src_offset[1] + (src_stride[1] * (GST_ROUND_UP_2(stream->height)>>1));
- stream->stride[0] = info.planes[0].stride;
- stream->elevation[0] = info.planes[0].size / info.planes[0].stride;
- stream->stride[1] = info.planes[1].stride;
- stream->elevation[1] = info.planes[1].size / info.planes[1].stride;
- stream->stride[2] = info.planes[2].stride;
- stream->elevation[2] = info.planes[2].size / info.planes[2].stride;
- size = info.planes[0].size + info.planes[1].size + info.planes[2].size;
- } else if (stream->format == MM_PIXEL_FORMAT_RGBA) {
- stream->stride[0] = stream->width * 4;
- stream->elevation[0] = stream->height;
- size = stream->stride[0] * stream->height;
- } else {
- LOGE("Not support format %d", stream->format);
+ if (!__mmplayer_swcodec_set_stride_elevation(stream))
goto ERROR;
- }
- stream->bo[0] = __mmplayer_video_stream_get_bo(player, size);
- if (!stream->bo[0]) {
- LOGE("Fail to tbm_bo_alloc!!");
+ if (!__mmplayer_swcodec_set_bo(player, stream, mem))
goto ERROR;
- }
-
- thandle = tbm_bo_map(stream->bo[0], TBM_DEVICE_CPU, TBM_OPTION_WRITE);
- if (thandle.ptr && mapinfo.data) {
- if (stream->format == MM_PIXEL_FORMAT_I420) {
- for (i = 0; i < 3; i++) {
- src = mapinfo.data + src_offset[i];
- dest = thandle.ptr + info.planes[i].offset;
-
- if (i > 0) k = 1;
- for (j = 0; j < stream->height>>k; j++) {
- memcpy(dest, src, stream->width>>k);
- src += src_stride[i];
- dest += stream->stride[i];
- }
- }
- } else if (stream->format == MM_PIXEL_FORMAT_RGBA) {
- memcpy(thandle.ptr, mapinfo.data, size);
- } else {
- LOGE("Not support format %d", stream->format);
- goto ERROR;
- }
- } else {
- LOGE("data pointer is wrong. dest : %p, src : %p",
- thandle.ptr, mapinfo.data);
- goto ERROR;
- }
- tbm_bo_unmap(stream->bo[0]);
}
- if (player->video_stream_cb) { /* This has been already checked at the entry */
- if (!player->video_stream_cb(stream, player->video_stream_cb_user_param)) {
- LOGE("failed to send video stream data.");
- goto ERROR;
- }
+ if (!player->video_stream_cb(stream, player->video_stream_cb_user_param)) {
+ LOGE("failed to send video stream data.");
+ goto ERROR;
}
- gst_memory_unmap(mem, &mapinfo);
return;
if (stream->bo[0])
_mmplayer_video_stream_release_bo(player, stream->bo[0]);
}
-
- gst_memory_unmap(mem, &mapinfo);
g_free(stream);
return;
}
return ret;
}
+
+static MMPlayerVideoStreamDataType*
+__mmplayer_create_stream_from_pad(GstPad *pad)
+{
+ GstCaps *caps = NULL;
+ GstStructure *structure = NULL;
+ unsigned int fourcc = 0;
+ const gchar *string_format = NULL;
+ MMPlayerVideoStreamDataType *stream = NULL;
+ gint width, height;
+ MMPixelFormatType format;
+
+ caps = gst_pad_get_current_caps(pad);
+ if (!caps) {
+ LOGE("Caps is NULL.");
+ return NULL;
+ }
+
+ /* MMPLAYER_LOG_GST_CAPS_TYPE(caps); */
+ structure = gst_caps_get_structure(caps, 0);
+ gst_structure_get_int(structure, "width", &width);
+ gst_structure_get_int(structure, "height", &height);
+ string_format = gst_structure_get_string(structure, "format");
+ if (string_format)
+ fourcc = _mmplayer_convert_fourcc_string_to_value(string_format);
+ format = util_get_pixtype(fourcc);
+ gst_caps_unref(caps);
+
+ /* moved here */
+ if (width == 0 || height == 0 || format == MM_PIXEL_FORMAT_INVALID) {
+ LOGE("Wrong condition!!");
+ return NULL;
+ }
+
+ stream = (MMPlayerVideoStreamDataType *)g_malloc0(sizeof(MMPlayerVideoStreamDataType));
+ if (!stream) {
+ LOGE("failed to alloc mem for video data");
+ return NULL;
+ }
+
+ stream->width = width;
+ stream->height = height;
+ stream->format = format;
+
+ return stream;
+}
+
+static void
+__mmplayer_zerocopy_set_stride_elevation_bo(MMPlayerVideoStreamDataType *stream, GstMemory *mem)
+{
+ unsigned int pitch = 0;
+ int index = 0;
+ tbm_surface_h surface = gst_tizen_memory_get_surface(mem);
+
+ for (index = 0; index < gst_tizen_memory_get_num_bos(mem); index++) {
+ tbm_surface_internal_get_plane_data(surface, index, NULL, NULL, &pitch);
+ stream->bo[index] = tbm_bo_ref(gst_tizen_memory_get_bos(mem, index));
+ stream->stride[index] = pitch;
+ stream->elevation[index] = stream->height;
+ }
+}
+
+static gboolean
+__mmplayer_swcodec_set_stride_elevation(MMPlayerVideoStreamDataType *stream)
+{
+ if (stream->format == MM_PIXEL_FORMAT_I420) {
+ int ret = TBM_SURFACE_ERROR_NONE;
+ tbm_surface_h surface;
+ tbm_surface_info_s info;
+
+ surface = tbm_surface_create(stream->width, stream->height, TBM_FORMAT_YUV420);
+
+ ret = tbm_surface_get_info(surface, &info);
+ if (ret != TBM_SURFACE_ERROR_NONE) {
+ tbm_surface_destroy(surface);
+ return FALSE;
+ }
+
+ tbm_surface_destroy(surface);
+ stream->stride[0] = info.planes[0].stride;
+ stream->elevation[0] = info.planes[0].size / info.planes[0].stride;
+ stream->stride[1] = info.planes[1].stride;
+ stream->elevation[1] = info.planes[1].size / info.planes[1].stride;
+ stream->stride[2] = info.planes[2].stride;
+ stream->elevation[2] = info.planes[2].size / info.planes[2].stride;
+ stream->bo_size = info.planes[0].size + info.planes[1].size + info.planes[2].size;
+ } else if (stream->format == MM_PIXEL_FORMAT_RGBA) {
+ stream->stride[0] = stream->width * 4;
+ stream->elevation[0] = stream->height;
+ stream->bo_size = stream->stride[0] * stream->height;
+ } else {
+ LOGE("Not support format %d", stream->format);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static gboolean
+__mmplayer_swcodec_set_bo(mm_player_t *player, MMPlayerVideoStreamDataType *stream, GstMemory *mem)
+{
+ tbm_bo_handle thandle;
+ gboolean is_mapped;
+ int src_stride[MM_PLAYER_IMGB_MPLANE_MAX] = { 0, };
+ int src_offset[MM_PLAYER_IMGB_MPLANE_MAX] = { 0, };
+ int dest_offset[MM_PLAYER_IMGB_MPLANE_MAX] = { 0, };
+ int i = 0;
+ int j = 0;
+ int k = 0;
+ unsigned char *src = NULL;
+ unsigned char *dest = NULL;
+ GstMapInfo mapinfo = GST_MAP_INFO_INIT;
+
+ is_mapped = gst_memory_map(mem, &mapinfo, GST_MAP_READWRITE);
+ if (!is_mapped) {
+ LOGE("fail to gst_memory_map");
+ return FALSE;
+ }
+
+ if (!mapinfo.data) {
+ LOGE("data pointer is wrong");
+ goto ERROR;
+ }
+
+ stream->bo[0] = __mmplayer_video_stream_get_bo(player, stream->bo_size);
+ if (!stream->bo[0]) {
+ LOGE("Fail to tbm_bo_alloc!!");
+ goto ERROR;
+ }
+
+ thandle = tbm_bo_map(stream->bo[0], TBM_DEVICE_CPU, TBM_OPTION_WRITE);
+ if (!thandle.ptr) {
+ LOGE("thandle pointer is wrong");
+ goto ERROR;
+ }
+
+ if (stream->format == MM_PIXEL_FORMAT_I420) {
+ src_stride[0] = GST_ROUND_UP_4(stream->width);
+ src_stride[1] = src_stride[2] = GST_ROUND_UP_4(stream->width >> 1);
+ src_offset[1] = src_stride[0] * GST_ROUND_UP_2(stream->height);
+ src_offset[2] = src_offset[1] + (src_stride[1] * (GST_ROUND_UP_2(stream->height) >> 1));
+
+ dest_offset[0] = 0;
+ dest_offset[1] = stream->stride[0] * stream->elevation[0];
+ dest_offset[2] = dest_offset[1] + stream->stride[1] * stream->elevation[1];
+
+ for (i = 0; i < 3; i++) {
+ src = mapinfo.data + src_offset[i];
+ dest = thandle.ptr + dest_offset[i];
+
+ if (i > 0)
+ k = 1;
+
+ for (j = 0; j < stream->height >> k; j++) {
+ memcpy(dest, src, stream->width>>k);
+ src += src_stride[i];
+ dest += stream->stride[i];
+ }
+ }
+ } else if (stream->format == MM_PIXEL_FORMAT_RGBA) {
+ memcpy(thandle.ptr, mapinfo.data, stream->bo_size);
+ } else {
+ LOGE("Not support format %d", stream->format);
+ goto ERROR;
+ }
+
+ tbm_bo_unmap(stream->bo[0]);
+ gst_memory_unmap(mem, &mapinfo);
+
+ return TRUE;
+
+ERROR:
+ if (stream->bo[0])
+ tbm_bo_unmap(stream->bo[0]);
+
+ if (is_mapped)
+ gst_memory_unmap(mem, &mapinfo);
+
+ return FALSE;
+}