fix issue when bitrate is not set with media packet 84/88484/6 accepted/tizen/3.0/ivi/20161011.055424 accepted/tizen/3.0/mobile/20161015.032154 accepted/tizen/3.0/tv/20161016.003638 accepted/tizen/3.0/wearable/20161015.080436 accepted/tizen/common/20160921.162302 accepted/tizen/ivi/20160922.042644 accepted/tizen/mobile/20160922.042429 accepted/tizen/tv/20160922.042517 accepted/tizen/wearable/20160922.042600 submit/tizen/20160921.041639 submit/tizen_3.0_ivi/20161010.000005 submit/tizen_3.0_mobile/20161015.000000 submit/tizen_3.0_tv/20161015.000000 submit/tizen_3.0_wearable/20161015.000000
authorSejun Park <sejun79.park@samsung.com>
Mon, 19 Sep 2016 09:33:04 +0000 (18:33 +0900)
committerSejun Park <sejun79.park@samsung.com>
Tue, 20 Sep 2016 05:59:23 +0000 (14:59 +0900)
Change-Id: I7ed942a8ee3d5ea9eab1c72c13e247ba2553e980

include/media_codec_port_gst.h
src/media_codec_port_gst.c

index d4bbd89..ffcff60 100755 (executable)
@@ -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;
 
index 5e38462..22359a4 100755 (executable)
@@ -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);