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);
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);
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;
}
}
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;
}
}
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)) {
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);
/* 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,
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);