if (tmp && tmp->bo == bo) {
tmp->using = FALSE;
LOGD("release bo %p", bo);
+ tbm_bo_unref(tmp->bo);
MMPLAYER_VIDEO_BO_UNLOCK(player);
MMPLAYER_VIDEO_BO_SIGNAL(player);
return ret;
LOGD("found bo %p to use", tmp->bo);
tmp->using = TRUE;
MMPLAYER_VIDEO_BO_UNLOCK(player);
- return tmp->bo;
+ return tbm_bo_ref(tmp->bo);
}
}
if (!ret) {
{
mm_player_t* player = (mm_player_t*)data;
GstCaps *caps = NULL;
- MMPlayerVideoStreamDataType stream;
+ MMPlayerVideoStreamDataType *stream = NULL;
MMVideoBuffer *video_buffer = NULL;
GstMemory *dataBlock = NULL;
GstMemory *metaBlock = NULL;
/* MMPLAYER_LOG_GST_CAPS_TYPE(caps); */
/* clear stream data structure */
- memset(&stream, 0x0, sizeof(MMPlayerVideoStreamDataType));
+ stream = (MMPlayerVideoStreamDataType *)g_malloc0(sizeof(MMPlayerVideoStreamDataType));
+ if (!stream) {
+ LOGE("failed to alloc mem for video data");
+ return;
+ }
structure = gst_caps_get_structure(caps, 0);
- gst_structure_get_int(structure, "width", & (stream.width));
- gst_structure_get_int(structure, "height", & (stream.height));
+ 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);
+ stream->format = util_get_pixtype(fourcc);
gst_caps_unref(caps);
caps = NULL;
GST_BUFFER_DATA(buffer), stream.width, stream.height, stream.format);
*/
- if (stream.width == 0 || stream.height == 0 || stream.format == MM_PIXEL_FORMAT_INVALID) {
+ if (stream->width == 0 || stream->height == 0 || stream->format == MM_PIXEL_FORMAT_INVALID) {
LOGE("Wrong condition!!");
- return;
+ goto ERROR;
}
/* set size and timestamp */
dataBlock = gst_buffer_peek_memory(buffer, 0);
- stream.length_total = gst_memory_get_sizes(dataBlock, NULL, NULL);
- stream.timestamp = (unsigned int)(GST_BUFFER_PTS(buffer)/1000000); /* nano sec -> mili sec */
+ stream->length_total = gst_memory_get_sizes(dataBlock, NULL, NULL);
+ stream->timestamp = (unsigned int)(GST_BUFFER_PTS(buffer)/1000000); /* nano sec -> mili sec */
/* check zero-copy */
if (player->set_mode.video_zc &&
if (video_buffer) { /* hw codec */
/* set tbm bo */
if (video_buffer->type == MM_VIDEO_BUFFER_TYPE_TBM_BO) {
+ int i = 0;
+
/* copy pointer of tbm bo, stride, elevation */
- memcpy(stream.bo, video_buffer->handle.bo,
- sizeof(void *) * MM_VIDEO_BUFFER_PLANE_MAX);
- } else if (video_buffer->type == MM_VIDEO_BUFFER_TYPE_PHYSICAL_ADDRESS) {
- /* FIXME: need to check this path */
- memcpy(stream.data, video_buffer->data,
- sizeof(void *) * MM_VIDEO_BUFFER_PLANE_MAX);
- }
- memcpy(stream.stride, video_buffer->stride_width,
+ for (i = 0 ; i < MM_VIDEO_BUFFER_PLANE_MAX ; i++) {
+ stream->bo[i] = tbm_bo_ref(video_buffer->handle.bo[i]);
+ }
+ } else {
+ LOGE("Not support video buffer format");
+ goto ERROR;
+ }
+ memcpy(stream->stride, video_buffer->stride_width,
sizeof(int) * MM_VIDEO_BUFFER_PLANE_MAX);
- memcpy(stream.elevation, video_buffer->stride_height,
+ memcpy(stream->elevation, video_buffer->stride_height,
sizeof(int) * MM_VIDEO_BUFFER_PLANE_MAX);
- /* set gst buffer */
- stream.internal_buffer = buffer;
+
+ /* will be released, by calling _mm_player_video_stream_internal_buffer_unref() */
+ stream->internal_buffer = gst_buffer_ref(buffer);
} else { /* sw codec */
tbm_bo_handle thandle;
- int stride = GST_ROUND_UP_4(stream.width);
- int elevation = stream.height;
+ int stride = GST_ROUND_UP_4(stream->width);
+ int elevation = stream->height;
int size = 0;
gboolean gst_ret;
gst_ret = gst_memory_map(dataBlock, &mapinfo, GST_MAP_READWRITE);
if (!gst_ret) {
LOGE("fail to gst_memory_map");
- return;
+ goto ERROR;
}
- stream.stride[0] = stride;
- stream.elevation[0] = elevation;
- if (stream.format == MM_PIXEL_FORMAT_I420) {
- stream.stride[1] = stream.stride[2] = GST_ROUND_UP_4(GST_ROUND_UP_2(stream.width) / 2);
- stream.elevation[1] = stream.elevation[2] = stream.height / 2;
- size = stream.stride[0] * stream.elevation[0] + stream.stride[1] * stream.elevation[1] + stream.stride[2] * stream.elevation[2];
- } else if (stream.format == MM_PIXEL_FORMAT_RGBA) {
- stream.stride[0] = stream.width * 4;
- size = stream.stride[0] * stream.height;
+ stream->stride[0] = stride;
+ stream->elevation[0] = elevation;
+ if (stream->format == MM_PIXEL_FORMAT_I420) {
+ stream->stride[1] = stream->stride[2] = GST_ROUND_UP_4(GST_ROUND_UP_2(stream->width) / 2);
+ stream->elevation[1] = stream->elevation[2] = stream->height / 2;
+ size = stream->stride[0] * stream->elevation[0] + stream->stride[1] * stream->elevation[1] + stream->stride[2] * stream->elevation[2];
+ } else if (stream->format == MM_PIXEL_FORMAT_RGBA) {
+ stream->stride[0] = stream->width * 4;
+ size = stream->stride[0] * stream->height;
} else {
- LOGE("Not support format %d", stream.format);
- gst_memory_unmap(dataBlock, &mapinfo);
- return;
+ LOGE("Not support format %d", stream->format);
+ goto ERROR;
}
- stream.bo[0] = __mmplayer_video_stream_get_bo(player, size);
- if (!stream.bo[0]) {
+ stream->bo[0] = __mmplayer_video_stream_get_bo(player, size);
+ if (!stream->bo[0]) {
LOGE("Fail to tbm_bo_alloc!!");
- gst_memory_unmap(dataBlock, &mapinfo);
- return;
+ goto ERROR;
}
- thandle = tbm_bo_map(stream.bo[0], TBM_DEVICE_CPU, TBM_OPTION_WRITE);
- if (thandle.ptr && mapinfo.data)
+
+ thandle = tbm_bo_map(stream->bo[0], TBM_DEVICE_CPU, TBM_OPTION_WRITE);
+
+ /* copy the video data to bo, so don't need to ref the buffer */
+ if (thandle.ptr && mapinfo.data) {
memcpy(thandle.ptr, mapinfo.data, size);
- else
- LOGE("data pointer is wrong. dest : %p, src : %p",
- thandle.ptr, mapinfo.data);
- tbm_bo_unmap(stream.bo[0]);
+ tbm_bo_unmap(stream->bo[0]);
+ } else {
+ LOGE("data pointer is wrong. dest : %p, src : %p", thandle.ptr, mapinfo.data);
+ tbm_bo_unmap(stream->bo[0]);
+ goto ERROR;
+ }
}
- if (player->video_stream_cb)
- player->video_stream_cb(&stream, player->video_stream_cb_user_param);
+ if (player->video_stream_cb) {
+ if (!player->video_stream_cb(stream, player->video_stream_cb_user_param)) {
+ LOGE("failed to send video stream data.");
+ goto ERROR;
+ }
+ }
if (metaBlock)
gst_memory_unmap(metaBlock, &mapinfo);
gst_memory_unmap(dataBlock, &mapinfo);
return;
+
+ERROR:
+ LOGE("release video stream resource.");
+ if (metaBlock) {
+ int i = 0;
+ for (i = 0 ; i < MM_VIDEO_BUFFER_PLANE_MAX ; i++) {
+ if (stream->bo[i])
+ tbm_bo_unref(stream->bo[i]);
+ }
+ gst_memory_unmap(metaBlock, &mapinfo);
+
+ /* unref gst buffer */
+ if (stream->internal_buffer)
+ gst_buffer_unref(stream->internal_buffer);
+ } else if (dataBlock) {
+ if (stream->bo[0])
+ _mmplayer_video_stream_release_bo(player, stream->bo[0]);
+ gst_memory_unmap(dataBlock, &mapinfo);
+ }
+
+ g_free(stream);
+ return;
}
static int
LOGE("unidentified surface type");
goto ERROR;
}
- LOGD("selected videosink name: %s", videosink_element);
+ LOGD("surface_type %d, selected videosink name: %s", surface_type, videosink_element);
MMPLAYER_CREATE_ELEMENT(videobin, MMPLAYER_V_SINK, videosink_element, videosink_element, TRUE, player);
__mmplayer_release_misc(mm_player_t* player)
{
int i;
- gboolean cur_mode = player->set_mode.rich_audio;
+ bool cur_mode = player->set_mode.rich_audio;
MMPLAYER_FENTER();
MMPLAYER_RETURN_IF_FAIL(player);
return MM_ERROR_NONE;
}
-void * _mm_player_media_packet_video_stream_internal_buffer_ref(void *buffer)
-{
- void * ret = NULL
- MMPLAYER_FENTER();
- /* increase ref count of gst buffer */
- if (buffer)
- ret = gst_buffer_ref((GstBuffer *)buffer);
-
- MMPLAYER_FLEAVE();
- return ret;
-}
-
-void _mm_player_media_packet_video_stream_internal_buffer_unref(void *buffer)
+void _mm_player_video_stream_internal_buffer_unref(void *buffer)
{
MMPLAYER_FENTER();
if (buffer) {
+ // LOGD("unref internal gst buffer %p", buffer);
gst_buffer_unref((GstBuffer *)buffer);
buffer = NULL;
}