static void __mc_input_buffer_finalize_cb(GstMCBuffer *buffer);
static int __mc_set_caps_streamheader(mc_gst_core_t *core, GstMCBuffer *mcbuffer, guint streamheader_size);
static int __mc_set_caps_codecdata(mc_gst_core_t *core, GstMCBuffer *mcbuffer, guint codecdata_size);
-static void __mc_push_output_to_queue(mc_gst_core_t *core, media_packet_h out_packet);
-static int __mc_gst_create_eos_packet(media_format_h fmt, media_packet_h *out_packet);
+static void __mc_push_output_to_queue(mc_gst_core_t *core, GstMCBuffer *mcbuffer);
+static int __mc_gst_create_eos_packet(media_format_h fmt, GstMCBuffer *mcbuffer);
static void _mc_gst_handle_input_buffer_used(mc_gst_core_t *core, media_packet_h packet);
static gint __gst_handle_stream_error(mc_gst_core_t *core, GError *error, GstMessage *message);
core->unprepare_flag = false;
core->prepare_count = 0;
core->etb_count = 0;
- core->ftb_count = 0;
core->codec_data = NULL;
g_atomic_int_set(&core->available_queue->running, 1);
return MC_ERROR;
}
-void __mc_push_output_to_queue(mc_gst_core_t *core, media_packet_h out_packet)
+void __mc_push_output_to_queue(mc_gst_core_t *core, GstMCBuffer *mcbuffer)
{
g_mutex_lock(&core->ports[1]->mutex);
/* push it to output buffer queue */
- g_queue_push_tail(core->ports[1]->queue, out_packet);
+ g_queue_push_tail(core->ports[1]->queue, mcbuffer->packet);
g_cond_broadcast(&core->out_buffer_cond);
- g_atomic_int_inc(&core->ftb_count);
- GstBuffer *buffer = NULL;
- media_packet_get_extra(out_packet, (void**)&buffer);
- if (buffer) {
- LOGD("dq : v(%d)e(%d) %d TIMESTAMP = %"GST_TIME_FORMAT " DURATION = %"GST_TIME_FORMAT, core->video, core->encoder,
- core->ftb_count, GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)), GST_TIME_ARGS(GST_BUFFER_DURATION(buffer)));
+ if (mcbuffer->buffer) {
+ LOGD("dq : v(%d)e(%d) TIMESTAMP = %"GST_TIME_FORMAT " DURATION = %"GST_TIME_FORMAT, core->video, core->encoder,
+ GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(mcbuffer->buffer)), GST_TIME_ARGS(GST_BUFFER_DURATION(mcbuffer->buffer)));
} else {
- LOGD("dq : v(%d)e(%d) %d ", core->video, core->encoder, core->ftb_count);
+ LOGD("dq : v(%d)e(%d)", core->video, core->encoder);
}
g_mutex_unlock(&core->ports[1]->mutex);
if (core->user_cb[_MEDIACODEC_EVENT_TYPE_FILLBUFFER]) {
((mc_fill_buffer_cb) core->user_cb[_MEDIACODEC_EVENT_TYPE_FILLBUFFER])
- (out_packet, core->user_data[_MEDIACODEC_EVENT_TYPE_FILLBUFFER]);
+ (mcbuffer->packet, core->user_data[_MEDIACODEC_EVENT_TYPE_FILLBUFFER]);
}
}
core->need_sync_flag = false;
}
- __mc_push_output_to_queue(core, mcbuffer->packet);
+ __mc_push_output_to_queue(core, mcbuffer);
} else {
gst_buffer_unref(buffer);
LOGE("Failed to dequeue output packet");
int __mc_output_buffer_finalize_cb(media_packet_h packet, int error_code, void *user_data)
{
- void *buffer = NULL;
int i = 0;
guint n;
GstMemory *mem;
GstMapInfo map = GST_MAP_INFO_INIT;
MMVideoBuffer *mm_video_buf = NULL;
- GList *find;
MEDIACODEC_FENTER();
GstMCBuffer *mcbuffer = (GstMCBuffer *)user_data;
- mc_gst_core_t *core = mcbuffer->core;
- g_mutex_lock(&core->ports[1]->mutex);
-
- if ((find = g_queue_find(core->ports[1]->queue, packet))) {
- LOGD("remove packet from queue");
- g_queue_remove(core->ports[1]->queue, packet);
- }
-
- g_mutex_unlock(&core->ports[1]->mutex);
+ if (mcbuffer->buffer) {
+ n = gst_buffer_n_memory(mcbuffer->buffer);
- g_atomic_int_dec_and_test(&core->ftb_count);
+ if (n > 1) {
+ mem = gst_buffer_peek_memory(mcbuffer->buffer, n-1);
+ gst_memory_map(mem, &map, GST_MAP_READ);
+ mm_video_buf = (MMVideoBuffer *)map.data;
- buffer = mcbuffer->buffer;
-
- n = gst_buffer_n_memory(buffer);
-
- if (n > 1) {
- mem = gst_buffer_peek_memory(buffer, n-1);
- gst_memory_map(mem, &map, GST_MAP_READ);
- mm_video_buf = (MMVideoBuffer *)map.data;
-
- if (!mm_video_buf) {
- LOGW("gstbuffer map.data is null");
- } else {
- for (i = 0; i < MM_VIDEO_BUFFER_PLANE_MAX; i++) {
- if (mm_video_buf->handle.bo[i])
- tbm_bo_unref(mm_video_buf->handle.bo[i]);
+ if (!mm_video_buf) {
+ LOGW("gstbuffer map.data is null");
+ } else {
+ for (i = 0; i < MM_VIDEO_BUFFER_PLANE_MAX; i++) {
+ if (mm_video_buf->handle.bo[i])
+ tbm_bo_unref(mm_video_buf->handle.bo[i]);
+ }
}
+ gst_memory_unmap(mem, &map);
}
- gst_memory_unmap(mem, &map);
+ gst_buffer_unref((GstBuffer *)mcbuffer->buffer);
}
if (mcbuffer->ext_mem) {
mcbuffer->ext_mem = NULL;
}
- gst_buffer_unref((GstBuffer *)buffer);
- LOGD("@v(%d)e(%d)output port filled buffer(%d): %p", core->video, core->encoder, core->ftb_count, packet);
+ LOGD("output port filled buffer : %p", packet);
+ g_free(mcbuffer);
MEDIACODEC_FLEAVE();
return mcbuffer;
}
-int __mc_gst_create_eos_packet(media_format_h fmt, media_packet_h *out_packet)
+int __mc_gst_create_eos_packet(media_format_h fmt, GstMCBuffer *mcbuffer)
{
gint ret = MC_ERROR_NONE;
- media_packet_h mediabuf = NULL;
+ media_packet_h packet = NULL;
MEDIACODEC_FENTER();
- if (media_packet_create(fmt, NULL, NULL, &mediabuf)) {
+ if (media_packet_create_alloc(fmt, __mc_output_buffer_finalize_cb, mcbuffer, &packet)) {
LOGE("media_packet_create_alloc failed\n");
ret = MC_ERROR;
goto ERROR;
}
- if (media_packet_set_flags(mediabuf, MEDIA_PACKET_END_OF_STREAM)) {
+ if (media_packet_set_flags(packet, MEDIA_PACKET_END_OF_STREAM)) {
LOGE("unable to set EOS flag\n");
ret = MC_ERROR;
goto ERROR;
}
- *out_packet = mediabuf;
+ mcbuffer->buffer = NULL;
+ mcbuffer->ext_mem = NULL;
+ mcbuffer->buf_size = 0;
+ mcbuffer->packet = packet;
MEDIACODEC_FLEAVE();
return ret;
ERROR:
- if (mediabuf)
- media_packet_destroy(mediabuf);
- *out_packet = NULL;
+ if (packet)
+ media_packet_destroy(packet);
MEDIACODEC_FLEAVE();
return ret;
}
gboolean __mc_gst_bus_callback(GstBus *bus, GstMessage *msg, gpointer data)
{
gint ret = MC_ERROR_NONE;
+ GstMCBuffer *mcbuffer = NULL;
+
mc_gst_core_t *core = (mc_gst_core_t *)data;
- LOGD("@%p v(%d)e(%d)bus message : %s", core, core->video, core->encoder, gst_message_type_get_name(GST_MESSAGE_TYPE(msg)));
+ LOGI("@%p v(%d)e(%d)bus message : %s", core, core->video, core->encoder, gst_message_type_get_name(GST_MESSAGE_TYPE(msg)));
switch (GST_MESSAGE_TYPE(msg)) {
case GST_MESSAGE_EOS:
_mc_send_eos_signal(core);
- media_packet_h out_packet = NULL;
- if (MC_ERROR_NONE == __mc_gst_create_eos_packet(core->output_fmt, &out_packet)) {
- __mc_push_output_to_queue(core, out_packet);
+ mcbuffer = (GstMCBuffer *)g_malloc0(sizeof(GstMCBuffer));
+ if (__mc_gst_create_eos_packet(core->output_fmt, mcbuffer) == MC_ERROR_NONE) {
+ __mc_push_output_to_queue(core, mcbuffer);
LOGD("send eos packet.");
} else {
LOGE("failed to create eos packet.");
+ g_free(mcbuffer);
}
if (core->user_cb[_MEDIACODEC_EVENT_TYPE_EOS]) {
_mc_gst_handle_input_buffer_used(core, mcbuffer->packet);
- free(mcbuffer);
+ g_free(mcbuffer);
mcbuffer = NULL;
MEDIACODEC_FLEAVE();
{
GstMCBuffer *mcbuffer = NULL;
- mcbuffer = (GstMCBuffer *)malloc(sizeof(*mcbuffer));
+ mcbuffer = (GstMCBuffer *)g_malloc0(sizeof(GstMCBuffer));
if (mcbuffer == NULL) {
LOGE("malloc fail");
while (!g_queue_is_empty(core->ports[1]->queue)) {
packet = g_queue_pop_head(core->ports[1]->queue);
- g_atomic_int_dec_and_test(&core->ftb_count);
- LOGD("%p poped(%d)", packet, core->ftb_count);
+ LOGD("%p poped", packet);
if (packet) {
media_packet_destroy(packet);
LOGD("outpacket destroyed");