From: Sejun Park Date: Mon, 19 Sep 2016 09:33:04 +0000 (+0900) Subject: fix issue when bitrate is not set with media packet X-Git-Tag: submit/tizen/20160921.041639^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F84%2F88484%2F6;p=platform%2Fcore%2Fapi%2Fmediacodec.git fix issue when bitrate is not set with media packet Change-Id: I7ed942a8ee3d5ea9eab1c72c13e247ba2553e980 --- diff --git a/include/media_codec_port_gst.h b/include/media_codec_port_gst.h index d4bbd89..ffcff60 100755 --- a/include/media_codec_port_gst.h +++ b/include/media_codec_port_gst.h @@ -113,6 +113,7 @@ struct _mc_gst_core_t { GMutex prepare_lock; GMutex drain_lock; GCond buffer_cond; + GCond out_buffer_cond; GCond eos_cond; GCond eos_waiting_cond; diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index 5e38462..22359a4 100755 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -829,6 +829,7 @@ mc_gst_core_t *mc_gst_core_new() g_mutex_init(&core->eos_mutex); g_cond_init(&core->eos_cond); g_cond_init(&core->buffer_cond); + g_cond_init(&core->out_buffer_cond); g_mutex_init(&core->prepare_lock); g_mutex_init(&core->drain_lock); @@ -871,6 +872,7 @@ void mc_gst_core_free(mc_gst_core_t *core) g_mutex_clear(&core->drain_lock); g_cond_clear(&core->eos_cond); g_cond_clear(&core->buffer_cond); + g_cond_clear(&core->out_buffer_cond); mc_async_queue_free(async_queue->input); g_free(async_queue); @@ -949,9 +951,9 @@ gboolean _mc_update_packet_info(mc_gst_core_t *core, media_format_h fmt) if (core->encoder) { mc_encoder_info_t *enc_info = (mc_encoder_info_t *)core->codec_info; - if (enc_info->bitrate != bitrate) { + if (bitrate != 0 && enc_info->bitrate != bitrate * 1000) { LOGD("Bitrate changed : %d -> %d", enc_info->bitrate, bitrate); - enc_info->bitrate = bitrate; + enc_info->bitrate = bitrate * 1000; is_updated = TRUE; } } @@ -974,9 +976,9 @@ gboolean _mc_update_packet_info(mc_gst_core_t *core, media_format_h fmt) if (core->encoder) { mc_encoder_info_t *enc_info = (mc_encoder_info_t *)core->codec_info; - if (enc_info->bitrate != bitrate) { + if (bitrate != 0 && enc_info->bitrate != bitrate * 1000) { LOGD("Bitrate changed : %d -> %d", enc_info->bitrate, bitrate); - enc_info->bitrate = bitrate; + enc_info->bitrate = bitrate * 1000; is_updated = TRUE; } } @@ -1617,7 +1619,7 @@ mc_ret_e mc_gst_process_input(mc_handle_t *mc_handle, media_packet_h inbuf, uint 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; + end_time = g_get_monotonic_time() + timeOutUs; LOGD("Waiting until packets are drained.."); if (!g_cond_wait_until(&core->buffer_cond, &core->drain_lock, end_time)) { @@ -1657,24 +1659,34 @@ mc_ret_e mc_gst_get_output(mc_handle_t *mc_handle, media_packet_h *outbuf, uint6 int ret = MC_ERROR_NONE; mc_gst_core_t *core = NULL; media_packet_h out_pkt = NULL; + gint64 end_time = -1; + gboolean signalled; + + end_time = g_get_monotonic_time() + timeOutUs; if (!mc_handle) return MC_PARAM_ERROR; core = (mc_gst_core_t *)mc_handle->core; - LOGI("@%p v(%d)e(%d) get_output", core, core->video, core->encoder); g_mutex_lock(&core->ports[1]->mutex); - if (!g_queue_is_empty(core->ports[1]->queue)) { + if (!g_queue_is_empty(core->ports[1]->queue)) + signalled = TRUE; + else { + LOGD("no buffer, wait for signal"); + signalled = g_cond_wait_until(&core->out_buffer_cond, &core->ports[1]->mutex, end_time); + } + + if (signalled) out_pkt = g_queue_pop_head(core->ports[1]->queue); - LOGD("pop from output_queue : %p", out_pkt); - } else { + else { + LOGW("Failed to get buffer"); ret = MC_OUTPUT_BUFFER_EMPTY; - LOGD("output_queue is empty"); } *outbuf = out_pkt; + LOGI("@%p v(%d)e(%d) got buffer :%p", core, core->video, core->encoder, out_pkt); g_mutex_unlock(&core->ports[1]->mutex); @@ -2007,6 +2019,7 @@ void __mc_gst_buffer_add(GstElement *element, GstBuffer *buffer, GstPad *pad, gp /* push it to output buffer queue */ g_queue_push_tail(core->ports[1]->queue, out_pkt); + g_cond_broadcast(&core->out_buffer_cond); g_atomic_int_inc(&core->ftb_count); LOGD("dq : %d TIMESTAMP = %"GST_TIME_FORMAT " DURATION = %"GST_TIME_FORMAT, @@ -2036,11 +2049,21 @@ int __mc_output_buffer_finalize_cb(media_packet_h packet, int error_code, void * GstMemory *mem; GstMapInfo map = GST_MAP_INFO_INIT; MMVideoBuffer *mm_video_buf = NULL; + GList *find; MEDIACODEC_FENTER(); mc_gst_core_t *core = (mc_gst_core_t *)user_data; + 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); + g_atomic_int_dec_and_test(&core->ftb_count); media_packet_get_extra(packet, &buffer);