static gint __gst_handle_library_error(mc_gst_core_t *core, int code);
static gint __gst_handle_core_error(mc_gst_core_t *core, int code);
static const gchar * _mc_error_to_string(mc_ret_e err);
-static int __mc_fill_video_packet_with_mm_video_buffer(mc_gst_core_t *core, void *data, int size, media_packet_h *out_pkt); /* will remove */
static int _mc_link_vtable(mc_gst_core_t *core, mediacodec_codec_type_e id, gboolean is_encoder, gboolean is_hw);
#ifdef TIZEN_PROFILE_LITE
static void _mc_gst_set_flush_input(mc_gst_core_t *core);
static void _mc_gst_set_flush_output(mc_gst_core_t *core);
+#ifdef TIZEN_EXYNOS_SPECIFIC
static int __tile_4x2_read(int x_size, int y_size, int x_pos, int y_pos);
static void __csc_tiled_to_linear_crop(unsigned char *yuv420_dest,
unsigned char *nv12t_src, int yuv420_width, int yuv420_height,
int left, int top, int right, int buttom);
+#endif
static void _mc_send_eos_signal(mc_gst_core_t *core);
static void _mc_wait_for_eos(mc_gst_core_t *core);
-
static int _mediacodec_get_mime(mc_gst_core_t *core);
/* video vtable */
buf_size = stride_width * stride_height;
memcpy(y_ptr + mc_buffer->buf_size, uv_ptr, buf_size);
- LOGD("width is same with stride");
- LOGD("plane : %d, buf_size : %d, total : %d", i, buf_size, mc_buffer->buf_size);
mc_buffer->buf_size += buf_size;
+ LOGD("plane : %d, buf_size : %d, total : %d", i, buf_size, mc_buffer->buf_size);
}
} else {
MMVideoBuffer *mm_video_buffer = NULL;
mm_video_buffer = __mc_gst_make_tbm_buffer(core, pkt);
- /* mm_video_buffer = core->mc_get_mm_video_buffer(pkt); */
gst_buffer_prepend_memory(mc_buffer->buffer,
gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, mm_video_buffer, sizeof(MMVideoBuffer), 0,
g_return_val_if_fail(core != NULL, MC_PARAM_ERROR);
- if (!core->is_hw) {
-
- mc_decoder_info_t *dec_info = (mc_decoder_info_t *)core->codec_info;
+ mc_decoder_info_t *dec_info = (mc_decoder_info_t *)core->codec_info;
+ if (!core->is_hw) {
width = dec_info->width;
height = dec_info->height;
stride_width = ALIGN(width, 4);
tbm_bo_unmap(bo[0]);
tsurf = tbm_surface_internal_create_with_bos(&tsurf_info, bo, 1);
-
- if (tsurf) {
- media_packet_create_from_tbm_surface(core->output_fmt, tsurf,
- (media_packet_finalize_cb)__mc_output_buffer_finalize_cb, core, pkt);
- }
-
} else {
- __mc_fill_video_packet_with_mm_video_buffer(core, data, size, pkt);
- /* tsurf = core->get_tbm_surface(data); */
- }
-/*
- if (tsurf) {
- media_packet_create_from_tbm_surface(core->output_fmt, tsurf,
- (media_packet_finalize_cb)__mc_output_buffer_finalize_cb, core, pkt);
- }
-*/
- return MC_ERROR_NONE;
-}
+ int bo_num = 0;
+ MMVideoBuffer *mm_vbuffer = NULL;
+ mm_vbuffer = (MMVideoBuffer *)data;
-int __mc_fill_video_packet_with_mm_video_buffer(mc_gst_core_t *core, void *data, int size, media_packet_h *out_pkt)
-{
- void *pkt_data = NULL;
- MMVideoBuffer *mm_vbuffer = NULL;
- int i;
- int bo_num = 0;
-
- g_return_val_if_fail(core != NULL, MC_PARAM_ERROR);
-
- mc_decoder_info_t *codec_info = (mc_decoder_info_t *)core->codec_info;
- mm_vbuffer = (MMVideoBuffer *)data;
-
- LOGD("buf_share_method %d", mm_vbuffer->type);
-
- LOGD("a[0] : %p, a[1] : %p, p[0] : %p, p[1] : %p",
- mm_vbuffer->data[0], mm_vbuffer->data[1], mm_vbuffer->handle.paddr[0], mm_vbuffer->handle.paddr[1]);
- LOGD("s[0]:%d, e[0]:%d, w[0]:%d, h[0]:%d",
- mm_vbuffer->stride_width[0], mm_vbuffer->stride_height[0], mm_vbuffer->width[0], mm_vbuffer->height[0]);
-
- if (mm_vbuffer->type == MM_VIDEO_BUFFER_TYPE_PHYSICAL_ADDRESS) {
- media_packet_set_buffer_size(*out_pkt, mm_vbuffer->width[0]*mm_vbuffer->height[0]*3/2);
- media_packet_get_buffer_data_ptr(*out_pkt, &pkt_data);
-
- __csc_tiled_to_linear_crop(pkt_data, mm_vbuffer->data[0],
- mm_vbuffer->stride_width[0], mm_vbuffer->stride_height[0], 0, 0, 0, 0);
- __csc_tiled_to_linear_crop(pkt_data+mm_vbuffer->stride_width[0]*mm_vbuffer->stride_height[0],
- mm_vbuffer->data[1], mm_vbuffer->stride_width[0], mm_vbuffer->stride_height[0]/2, 0, 0, 0, 0);
- } else if (mm_vbuffer->type == MM_VIDEO_BUFFER_TYPE_DMABUF_FD) {
- LOGD("FD type");
- } else if (mm_vbuffer->type == MM_VIDEO_BUFFER_TYPE_TBM_BO) {
- tbm_surface_h tsurf = NULL;
- tbm_surface_info_s tsurf_info;
- memset(&tsurf_info, 0x0, sizeof(tbm_surface_info_s));
+ if (mm_vbuffer->type == MM_VIDEO_BUFFER_TYPE_TBM_BO) {
+ tbm_surface_info_s tsurf_info;
+ memset(&tsurf_info, 0x0, sizeof(tbm_surface_info_s));
- /* create tbm surface */
- for (i = 0; i < MM_VIDEO_BUFFER_PLANE_MAX; i++) {
- if (mm_vbuffer->handle.bo[i]) {
- bo_num++;
- tsurf_info.planes[i].stride = mm_vbuffer->stride_width[i];
+ /* create tbm surface */
+ for (i = 0; i < MM_VIDEO_BUFFER_PLANE_MAX; i++) {
+ if (mm_vbuffer->handle.bo[i]) {
+ bo_num++;
+ tsurf_info.planes[i].stride = mm_vbuffer->stride_width[i];
+ }
}
- }
-
- if (bo_num > 0) {
- tsurf_info.width = codec_info->width;
- tsurf_info.height = codec_info->height;
- tsurf_info.format = TBM_FORMAT_NV12; /* bo_format */
- tsurf_info.bpp = tbm_surface_internal_get_bpp(TBM_FORMAT_NV12);
- tsurf_info.num_planes = tbm_surface_internal_get_num_planes(TBM_FORMAT_NV12);
- tsurf_info.size = 0;
-
- for (i = 0; i < tsurf_info.num_planes; i++) {
- tsurf_info.planes[i].stride = mm_vbuffer->stride_width[i];
- tsurf_info.planes[i].size = mm_vbuffer->stride_width[i] * mm_vbuffer->stride_height[i];
-
- if (i < bo_num)
- tsurf_info.planes[i].offset = 0;
- else
- tsurf_info.planes[i].offset = tsurf_info.planes[i-1].offset + tsurf_info.planes[i - 1].size;
- tsurf_info.size += tsurf_info.planes[i].size;
- LOGD("%d plane stride : %d, size : %d", i, tsurf_info.planes[i].stride, tsurf_info.planes[i].size);
+ if (bo_num > 0) {
+ tsurf_info.width = dec_info->width;
+ tsurf_info.height = dec_info->height;
+ tsurf_info.format = TBM_FORMAT_NV12; /* bo_format */
+ tsurf_info.bpp = tbm_surface_internal_get_bpp(TBM_FORMAT_NV12);
+ tsurf_info.num_planes = tbm_surface_internal_get_num_planes(TBM_FORMAT_NV12);
+ tsurf_info.size = 0;
+
+ for (i = 0; i < tsurf_info.num_planes; i++) {
+ tsurf_info.planes[i].stride = mm_vbuffer->stride_width[i];
+ tsurf_info.planes[i].size = mm_vbuffer->stride_width[i] * mm_vbuffer->stride_height[i];
+
+ if (i < bo_num)
+ tsurf_info.planes[i].offset = 0;
+ else
+ tsurf_info.planes[i].offset = tsurf_info.planes[i-1].offset + tsurf_info.planes[i - 1].size;
+
+ tsurf_info.size += tsurf_info.planes[i].size;
+ LOGD("%d plane stride : %d, size : %d", i, tsurf_info.planes[i].stride, tsurf_info.planes[i].size);
+ }
+ tsurf = tbm_surface_internal_create_with_bos(&tsurf_info, (tbm_bo *)mm_vbuffer->handle.bo, bo_num);
}
- tsurf = tbm_surface_internal_create_with_bos(&tsurf_info, (tbm_bo *)mm_vbuffer->handle.bo, bo_num);
}
+ }
- if (tsurf) {
- media_packet_create_from_tbm_surface(core->output_fmt, tsurf,
- (media_packet_finalize_cb)__mc_output_buffer_finalize_cb, core, out_pkt);
- }
+ if (tsurf) {
+ media_packet_create_from_tbm_surface(core->output_fmt, tsurf,
+ (media_packet_finalize_cb)__mc_output_buffer_finalize_cb, core, pkt);
}
return MC_ERROR_NONE;
int ret = MC_ERROR_NONE;
g_return_val_if_fail(core != NULL, MC_PARAM_ERROR);
+ if (core->encoder && core->codec_id == MEDIACODEC_AAC)
+ media_format_set_audio_aac_type(core->output_fmt, FALSE);
+
ret = media_packet_create_alloc(core->output_fmt, __mc_output_buffer_finalize_cb, core, out_pkt);
if (ret != MEDIA_PACKET_ERROR_NONE) {
LOGW("media_packet_create_alloc failed");
void *buf_data = NULL;
uint64_t buf_size = 0;
GstBuffer *codecdata_buffer;
+ guint8 *data;
+ GstMapInfo map;
ret = media_packet_get_buffer_size(buff->pkt, &buf_size);
if (ret != MEDIA_PACKET_ERROR_NONE) {
LOGD("Set caps for codec_data in mime : %s and codec_id (0x%x)", core->mime, core->codec_id);
/* Add the codec_data attribute to caps, if we have it */
- codecdata_buffer = gst_buffer_new_and_alloc(codecdata_size);
- gst_buffer_copy_into(codecdata_buffer, buff->buffer, GST_BUFFER_COPY_MEMORY, 0, codecdata_size);
- gst_buffer_ref(codecdata_buffer);
+ data = g_malloc0(codecdata_size);
+ gst_buffer_map(buff->buffer, &map, GST_MAP_READ);
+ memcpy(data, map.data, codecdata_size);
+ codecdata_buffer = gst_buffer_new_wrapped(data, codecdata_size);
+ gst_buffer_unmap(buff->buffer, &map);
LOGD("setting codec_data from (packet) buf_data used codecdata_size (%d)", codecdata_size);
gst_caps_set_simple(core->caps, "codec_data", GST_TYPE_BUFFER, codecdata_buffer, NULL);
g_mutex_init(&core->eos_mutex);
g_cond_init(&core->eos_cond);
+ g_cond_init(&core->buffer_cond);
g_mutex_init(&core->prepare_lock);
g_mutex_init(&core->drain_lock);
g_mutex_clear(&core->prepare_lock);
g_mutex_clear(&core->drain_lock);
g_cond_clear(&core->eos_cond);
+ g_cond_clear(&core->buffer_cond);
mc_async_queue_free(async_queue->input);
g_free(async_queue);
port->buffers = NULL;
g_mutex_init(&port->mutex);
- g_cond_init(&port->buffer_cond);
port->queue = g_queue_new();
LOGD("gst_port(%p) is created", port);
MEDIACODEC_FENTER();
g_mutex_clear(&port->mutex);
- g_cond_clear(&port->buffer_cond);
g_queue_free(port->queue);
LOGD("gst_port(%p) is freed", port);
}
pad = gst_element_get_static_pad(core->appsrc, "src");
- gst_pad_push_event(pad, gst_event_new_stream_start("sejun"));
+ gst_pad_push_event(pad, gst_event_new_stream_start("start"));
gst_object_unref(pad);
LOGD("caps updated");
if (encoder) {
core->vtable = is_hw ? venc_h264_hw_vtable : venc_vtable;
core->caps = gst_caps_new_empty_simple("video/x-raw");
+#ifdef TIZEN_PROFILE_LITE
+ g_object_set(GST_OBJECT(core->codec), "byte-stream", TRUE, NULL);
+#endif
} else {
if (is_hw) {
core->vtable = vdec_h264_hw_vtable;
int ret = MC_ERROR_NONE;
mc_gst_core_t *core = NULL;
- GTimeVal nowtv;
+ gint64 end_time;
if (!mc_handle)
return MC_PARAM_ERROR;
core = (mc_gst_core_t *)mc_handle->core;
- g_get_current_time(&nowtv);
- g_time_val_add(&nowtv, 500 * 1000); /* usec */
- /*
- if (!g_cond_timed_wait(&nowtv)) {
- }
- */
+ g_mutex_lock(&core->drain_lock);
+
+ while (g_atomic_int_get(&core->etb_count) > MAXINUM_QNUM) {
+ end_time = g_get_monotonic_time() + timeOutUs * G_TIME_SPAN_MILLISECOND;
+ LOGD("Waiting until packets are drained..");
+
+ if (!g_cond_wait_until(&core->buffer_cond, &core->drain_lock, end_time)) {
+ LOGD("time out...");
+ break;
+ }
+ }
+ g_mutex_unlock(&core->drain_lock);
if (core->prepare_count == 0)
return MC_INVALID_STATUS;
}
#endif
+#if TIZEN_EXYNOS_SPECIFIC
/*
* Get tiled address of position(x,y)
*
}
}
}
+#endif
void _mc_send_eos_signal(mc_gst_core_t *core)
{