X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fmedia_codec_port_gst.c;h=6465c59b4e0cbc081dbfe5712997f6995d1ab1d6;hb=b6f3d8b8167e944ba60dd969cf8534807d3647a6;hp=5d09f4b9a7746128b9e71074c3592801e26a1134;hpb=40784902baada12295340f66f82df0d2397d53a3;p=platform%2Fcore%2Fapi%2Fmediacodec.git diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c old mode 100755 new mode 100644 index 5d09f4b..6465c59 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -26,6 +26,8 @@ #include #include #include +#include +#include /* * Internal Implementation @@ -37,7 +39,7 @@ static media_packet_h _mc_get_input_buffer(mc_gst_core_t *core); static gboolean __mc_gst_init_gstreamer(); static int _mc_output_media_packet_new(mc_gst_core_t *core, bool video, bool encoder, media_format_mimetype_e out_mime); -static mc_ret_e _mc_gst_create_pipeline(mc_gst_core_t *core, gchar *factory_name); +static mc_ret_e _mc_gst_create_pipeline(mc_gst_core_t *core, const gchar *factory_name); static mc_ret_e _mc_gst_destroy_pipeline(mc_gst_core_t *core); static void __mc_gst_buffer_add(GstElement *element, GstBuffer *buffer, GstPad *pad, gpointer data); static int __mc_output_buffer_finalize_cb(media_packet_h packet, int error_code, void *user_data); @@ -84,77 +86,108 @@ static int _mc_set_codec_data(mc_gst_core_t *core, GstMCBuffer *mcbuffer, bool c GstCaps *_mc_gst_vid_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec_id, gint index); GstCaps *_mc_gst_aud_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec_id, gint index); +static int __mc_fill_input_buffer(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer); +static int __mc_fill_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); + +static int __mc_fill_input_buffer_with_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer); +static int __mc_fill_input_buffer_with_adec_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer); +static int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer); + +static int __mc_fill_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); +static int __mc_fill_aenc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); +static int __mc_fill_venc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); +static int __mc_fill_vdec_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); + +static mc_gst_core_t *mc_gst_core_new(); +static void mc_gst_core_free(mc_gst_core_t *core); + +static mc_gst_port_t *mc_gst_port_new(mc_gst_core_t *core); +static void mc_gst_port_free(mc_gst_port_t *port); /* video vtable */ -int(*vdec_vtable[])() = {&__mc_fill_input_buffer_with_packet, &__mc_fill_packet_with_output_buffer}; -int(*venc_vtable[])() = {&__mc_fill_input_buffer_with_packet, &__mc_fill_packet_with_output_buffer}; +__attribute__((unused)) +static int(*vdec_vtable[])() = {&__mc_fill_input_buffer_with_packet, &__mc_fill_packet_with_output_buffer}; +static int(*venc_vtable[])() = {&__mc_fill_input_buffer_with_packet, &__mc_fill_packet_with_output_buffer}; -int(*vdec_h264_sw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* S/W H.264 Decoder Vtable */ +static int(*vdec_h264_sw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* S/W H.264 Decoder Vtable */ &__mc_fill_vdec_packet_with_output_buffer}; -int(*vdec_mpeg4_sw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* S/W MPEG4 Decoder Vtable */ +static int(*vdec_mpeg4_sw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* S/W MPEG4 Decoder Vtable */ &__mc_fill_vdec_packet_with_output_buffer}; -int(*vdec_h263_sw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* S/W MPEG4 Decoder Vtable */ +static int(*vdec_h263_sw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* S/W MPEG4 Decoder Vtable */ &__mc_fill_vdec_packet_with_output_buffer}; -int(*vdec_h264_hw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* H/W H.264 Decoder Vtable */ +static int(*vdec_h264_hw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* H/W H.264 Decoder Vtable */ &__mc_fill_vdec_packet_with_output_buffer}; -int(*vdec_mpeg4_hw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* H/W MPEG4 Decoder Vtable */ +static int(*vdec_mpeg4_hw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* H/W MPEG4 Decoder Vtable */ &__mc_fill_vdec_packet_with_output_buffer}; -int(*vdec_h263_hw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* H/W MPEG4 Decoder Vtable */ +static int(*vdec_h263_hw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* H/W MPEG4 Decoder Vtable */ &__mc_fill_vdec_packet_with_output_buffer}; -int(*venc_mpeg4_sw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* S/W MPEG4 Encoder Vtable */ +static int(*venc_mpeg4_sw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* S/W MPEG4 Encoder Vtable */ &__mc_fill_venc_packet_with_output_buffer}; -int(*venc_h263_sw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* S/W MPEG4 Encoder Vtable */ +static int(*venc_h263_sw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* S/W MPEG4 Encoder Vtable */ &__mc_fill_venc_packet_with_output_buffer}; -int(*venc_h264_hw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* H/W H.264 Encoder Vtable */ +static int(*venc_h264_hw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* H/W H.264 Encoder Vtable */ &__mc_fill_venc_packet_with_output_buffer}; -int(*venc_mpeg4_hw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* H/W MPEG4 Encoder Vtable */ +static int(*venc_mpeg4_hw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* H/W MPEG4 Encoder Vtable */ &__mc_fill_venc_packet_with_output_buffer}; -int(*venc_h263_hw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* H/W MPEG4 Encoder Vtable */ +static int(*venc_h263_hw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* H/W MPEG4 Encoder Vtable */ &__mc_fill_venc_packet_with_output_buffer}; -int(*aenc_vtable[])() = {&__mc_fill_input_buffer_with_packet, &__mc_fill_packet_with_output_buffer}; -int(*adec_vtable[])() = {&__mc_fill_input_buffer_with_packet, &__mc_fill_packet_with_output_buffer}; +__attribute__((unused)) +static int(*aenc_vtable[])() = {&__mc_fill_input_buffer_with_packet, &__mc_fill_packet_with_output_buffer}; -int(*aenc_aac_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* AAC LC Encoder vtable */ +static int(*adec_vtable[])() = {&__mc_fill_input_buffer_with_packet, &__mc_fill_packet_with_output_buffer}; + +static int(*aenc_aac_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* AAC LC Encoder vtable */ &__mc_fill_aenc_packet_with_output_buffer}; -int(*adec_aac_vtable[])() = {&__mc_fill_input_buffer_with_adec_packet, /* AAC LC Decoder Vtable */ +static int(*adec_aac_vtable[])() = {&__mc_fill_input_buffer_with_adec_packet, /* AAC LC Decoder Vtable */ &__mc_fill_packet_with_output_buffer}; -int(*adec_aacv12_vtable[])() = {&__mc_fill_input_buffer_with_adec_packet, /* AAC HE Decoder Vtable */ +static int(*adec_aacv12_vtable[])() = {&__mc_fill_input_buffer_with_adec_packet, /* AAC HE Decoder Vtable */ &__mc_fill_packet_with_output_buffer}; -int(*adec_mp3_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* MP3 Decoder Vtable */ +static int(*adec_mp3_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* MP3 Decoder Vtable */ &__mc_fill_packet_with_output_buffer}; -int(*adec_amrnb_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* AMR-NB Decoder Vtable */ +static int(*adec_amrnb_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* AMR-NB Decoder Vtable */ &__mc_fill_packet_with_output_buffer}; -int(*adec_amrwb_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* AMR-WB Decoder Vtable */ +static int(*adec_amrwb_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* AMR-WB Decoder Vtable */ &__mc_fill_packet_with_output_buffer}; -int(*aenc_amrnb_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* AMR-NB Encoder Vtable */ +static int(*aenc_amrnb_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* AMR-NB Encoder Vtable */ &__mc_fill_packet_with_output_buffer}; -int(*adec_vorbis_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* VORBIS Decoder Vtable */ +static int(*adec_vorbis_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* VORBIS Decoder Vtable */ &__mc_fill_packet_with_output_buffer}; -int(*adec_flac_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* FLAC Decoder Vtable */ +static int(*adec_flac_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* FLAC Decoder Vtable */ &__mc_fill_packet_with_output_buffer}; -int(*adec_wma_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* WMA Decoder Vtable */ +static int(*adec_wma_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* WMA Decoder Vtable */ &__mc_fill_packet_with_output_buffer}; +static int(*aenc_opus_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* Opus Encoder Vtable */ + &__mc_fill_aenc_packet_with_output_buffer}; + +#define MEDIACODEC_ELEMENT_SET_STATE(x_element, x_state) \ + do { \ + LOGD("setting state [%s:%d] to [%s]\n", #x_state, x_state, GST_ELEMENT_NAME(x_element)); \ + if (GST_STATE_CHANGE_FAILURE == gst_element_set_state(x_element, x_state)) { \ + LOGE("failed to set state %s to %s\n", #x_state, GST_ELEMENT_NAME(x_element)); \ + goto STATE_CHANGE_FAILED; \ + } \ + } while (0) /* * fill_inbuf virtual functions @@ -195,7 +228,7 @@ int __mc_fill_inbuf_with_mm_video_buffer(mc_gst_core_t *core, media_packet_h pac return ret; } -int __mc_fill_input_buffer_with_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer) +static int __mc_fill_input_buffer_with_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer) { gint ret = MC_ERROR_NONE; void *buf_data = NULL; @@ -213,17 +246,18 @@ int __mc_fill_input_buffer_with_packet(mc_gst_core_t *core, media_packet_h packe return MC_ERROR; } - if (buf_data != NULL) { - gst_buffer_append_memory(mcbuffer->buffer, - gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, buf_data, buf_size, 0, - buf_size, mcbuffer, (GDestroyNotify)__mc_input_buffer_finalize_cb)); - LOGD("packet data apended"); - } + if (buf_data == NULL) + return MC_ERROR; + + gst_buffer_append_memory(mcbuffer->buffer, + gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, buf_data, buf_size, 0, + buf_size, mcbuffer, (GDestroyNotify)__mc_input_buffer_finalize_cb)); + LOGD("packet data apended"); return ret; } -int __mc_fill_input_buffer_with_adec_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer) +static int __mc_fill_input_buffer_with_adec_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer) { gint ret = MC_ERROR_NONE; uint64_t buf_size = 0; @@ -268,7 +302,7 @@ int __mc_fill_input_buffer_with_adec_packet(mc_gst_core_t *core, media_packet_h return ret; } -int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer) +static int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer) { gint ret = MC_ERROR_NONE; gint i; @@ -372,12 +406,12 @@ int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_packet_h * fill_outbuf virtual functions */ -int __mc_fill_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) +static int __mc_fill_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) { return core->vtable[fill_outbuf](core, data, size, mcbuffer); } -int __mc_fill_vdec_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) +static int __mc_fill_vdec_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) { int i; int stride_width; @@ -449,7 +483,7 @@ int __mc_fill_vdec_packet_with_output_buffer(mc_gst_core_t *core, void *data, in return MC_ERROR_NONE; } -int __mc_fill_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) +static int __mc_fill_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) { gint ret = MC_ERROR_NONE; gchar *ext_mem = NULL; @@ -481,7 +515,7 @@ int __mc_fill_packet_with_output_buffer(mc_gst_core_t *core, void *data, int siz return MC_ERROR_NONE; } -int __mc_fill_venc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) +static int __mc_fill_venc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) { gint ret = MC_ERROR_NONE; bool codec_config = FALSE; @@ -542,7 +576,7 @@ int __mc_fill_venc_packet_with_output_buffer(mc_gst_core_t *core, void *data, in return ret; } -int __mc_fill_aenc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) +static int __mc_fill_aenc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) { int ret = MC_ERROR_NONE; gint mem_size = 0; @@ -591,6 +625,9 @@ int __mc_fill_aenc_packet_with_output_buffer(mc_gst_core_t *core, void *data, in s = gst_caps_get_structure(peercaps, 0); codec_data = gst_structure_get_value(s, "codec_data"); + if (codec_data == NULL && gst_structure_has_field(s, "streamheader")) + codec_data = gst_structure_get_value(s, "streamheader"); + core->codec_data = GST_BUFFER(g_value_dup_boxed(codec_data)); gst_caps_unref(peercaps); } @@ -792,6 +829,31 @@ int __mc_set_caps_streamheader(mc_gst_core_t *core, GstMCBuffer *mcbuffer, guint __mc_gst_caps_set_buffer_array(core->caps, "streamheader", header1, header2, NULL); gst_buffer_unref(header1); gst_buffer_unref(header2); + } else if (core->codec_id == MEDIACODEC_OPUS) { + const GstTagList *tags; + GstTagList *empty_tags = NULL; + GstBuffer *header, *comments; + guint8 *decoding_channel_mapping = NULL; + mc_gst_port_def_t *port_def = &core->ports[in_port_index]->port_def; + + header = gst_codec_utils_opus_create_header(port_def->info.audio.samplerate, + port_def->info.audio.channel, + 0, /* channel mapping family */ + 1, /* stream count */ + 0, /* coupled count */ + decoding_channel_mapping, + 0, /* FIXME: look ahead configured value */ + 0); + tags = gst_tag_setter_get_tag_list(GST_TAG_SETTER(core->codec)); + if (!tags) + tags = empty_tags = gst_tag_list_new_empty(); + comments = gst_tag_list_to_vorbiscomment_buffer(tags, (const guint8 *) "OpusTags", + 8, "Encoded with GStreamer opusenc"); + core->caps = gst_codec_utils_opus_create_caps_from_header(header, comments); + if (empty_tags) + gst_tag_list_unref(empty_tags); + gst_buffer_unref(header); + gst_buffer_unref(comments); } else { LOGE("Not support case of Stream header Caps"); } @@ -882,7 +944,7 @@ int _mc_output_media_packet_new(mc_gst_core_t *core, bool video, bool encoder, m /* * mc_gst_core functions */ -mc_gst_core_t *mc_gst_core_new() +static mc_gst_core_t *mc_gst_core_new() { mc_gst_core_t *core; @@ -929,7 +991,7 @@ mc_gst_core_t *mc_gst_core_new() return core; } -void mc_gst_core_free(mc_gst_core_t *core) +static void mc_gst_core_free(mc_gst_core_t *core) { MEDIACODEC_FENTER(); @@ -979,7 +1041,7 @@ void mc_gst_core_free(mc_gst_core_t *core) /* * mc_gst_port functions */ -mc_gst_port_t *mc_gst_port_new(mc_gst_core_t *core) +static mc_gst_port_t *mc_gst_port_new(mc_gst_core_t *core) { MEDIACODEC_FENTER(); @@ -1000,7 +1062,7 @@ mc_gst_port_t *mc_gst_port_new(mc_gst_core_t *core) return port; } -void mc_gst_port_free(mc_gst_port_t *port) +static void mc_gst_port_free(mc_gst_port_t *port) { MEDIACODEC_FENTER(); @@ -1118,6 +1180,7 @@ static int _mc_set_codec_data(mc_gst_core_t *core, GstMCBuffer *mcbuffer, bool c break; case MEDIACODEC_VORBIS: case MEDIACODEC_FLAC: + case MEDIACODEC_OPUS: if (codec_config) { ret = __mc_set_caps_streamheader(core, mcbuffer, VORBIS_CODECDATA_SIZE); if (ret != MC_ERROR_NONE) @@ -1424,6 +1487,16 @@ GstCaps *_mc_gst_aud_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec NULL); } break; + case MEDIACODEC_OPUS: + if (core->encoder) { + gst_caps_set_simple(caps, + "format", G_TYPE_STRING, _mc_bit_to_string(port_def->info.audio.bit_depth), + "layout", G_TYPE_STRING, "interleaved", NULL); + } else { + LOGD("[MC_NOT_SUPPORTED] opus decoder is not supported yet!!!"); + return NULL; + } + break; default: break; } @@ -1477,7 +1550,7 @@ GstCaps *_mc_gst_vid_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec LOGE("format : %s", port_def->info.video.format); } else { gst_caps_set_simple(caps, - "parsed", G_TYPE_BOOLEAN, TRUE, /* FIXME different from sw */ + "parsed", G_TYPE_BOOLEAN, TRUE, /* FIXME different from sw */ "alignment", G_TYPE_STRING, "au", "stream-format", G_TYPE_STRING, "byte-stream", "framerate", GST_TYPE_FRACTION, 30, 1, @@ -1499,11 +1572,10 @@ static int _mc_link_vtable(mc_gst_core_t *core, mediacodec_codec_type_e id, gboo switch (id) { case MEDIACODEC_AAC: - if (encoder) { + if (encoder) core->vtable = aenc_aac_vtable; - } else { + else core->vtable = adec_aac_vtable; - } break; case MEDIACODEC_AAC_HE: case MEDIACODEC_AAC_HE_PS: @@ -1524,11 +1596,10 @@ static int _mc_link_vtable(mc_gst_core_t *core, mediacodec_codec_type_e id, gboo break; case MEDIACODEC_AMR_NB: LOGD("amrnb vtable"); - if (encoder) { + if (encoder) core->vtable = aenc_amrnb_vtable; - } else { + else core->vtable = adec_amrnb_vtable; - } break; case MEDIACODEC_AMR_WB: LOGD("amrwb vtable - Only support decoder"); @@ -1541,12 +1612,10 @@ static int _mc_link_vtable(mc_gst_core_t *core, mediacodec_codec_type_e id, gboo break; case MEDIACODEC_VORBIS: LOGD("vorbis vtable"); - if (encoder) { - LOGD("[MC_NOT_SUPPORTED] vorbis encoder is not supported yet!!!"); + if (encoder) return MC_NOT_SUPPORTED; - } else { + else core->vtable = adec_vorbis_vtable; - } break; case MEDIACODEC_FLAC: LOGD("flac vtable"); @@ -1557,6 +1626,13 @@ static int _mc_link_vtable(mc_gst_core_t *core, mediacodec_codec_type_e id, gboo core->vtable = adec_flac_vtable; } break; + case MEDIACODEC_OPUS: + LOGD("opus vtable"); + if (encoder) + core->vtable = aenc_opus_vtable; + else + core->vtable = adec_vtable; + break; case MEDIACODEC_WMAV1: case MEDIACODEC_WMAV2: case MEDIACODEC_WMAPRO: @@ -1574,31 +1650,28 @@ static int _mc_link_vtable(mc_gst_core_t *core, mediacodec_codec_type_e id, gboo if (encoder) { core->vtable = is_hw ? venc_h263_hw_vtable : venc_h263_sw_vtable; } else { - if (is_hw) { + if (is_hw) core->vtable = vdec_h263_hw_vtable; - } else { + else core->vtable = vdec_h263_sw_vtable; - } } break; case MEDIACODEC_MPEG4: LOGD("mpeg4 vtable"); - if (encoder) { + if (encoder) core->vtable = is_hw ? venc_mpeg4_hw_vtable : venc_mpeg4_sw_vtable; - } else { + else core->vtable = is_hw ? vdec_mpeg4_hw_vtable : vdec_mpeg4_sw_vtable; - } break; case MEDIACODEC_H264: LOGD("h264 vtable"); if (encoder) { core->vtable = is_hw ? venc_h264_hw_vtable : venc_vtable; } else { - if (is_hw) { + if (is_hw) core->vtable = vdec_h264_hw_vtable; - } else { + else core->vtable = vdec_h264_sw_vtable; - } } break; default: @@ -1795,7 +1868,7 @@ mc_ret_e mc_gst_unprepare(mc_handle_t *mc_handle) return ret; } -mc_ret_e mc_gst_process_input(mc_handle_t *mc_handle, media_packet_h inbuf, uint64_t timeOutUs) +mc_ret_e mc_gst_process_input(mc_handle_t *mc_handle, media_packet_h inbuf, uint64_t timeout_us) { MEDIACODEC_FENTER(); @@ -1839,7 +1912,7 @@ mc_ret_e mc_gst_process_input(mc_handle_t *mc_handle, media_packet_h inbuf, uint return ret; } -mc_ret_e mc_gst_get_output(mc_handle_t *mc_handle, media_packet_h *outbuf, uint64_t timeOutUs) +mc_ret_e mc_gst_get_output(mc_handle_t *mc_handle, media_packet_h *outbuf, uint64_t timeout_us) { gint ret = MC_ERROR_NONE; gint64 end_time = -1; @@ -1848,7 +1921,7 @@ mc_ret_e mc_gst_get_output(mc_handle_t *mc_handle, media_packet_h *outbuf, uint6 media_packet_h out_packet = NULL; MEDIACODEC_FENTER(); - end_time = g_get_monotonic_time() + timeOutUs; + end_time = g_get_monotonic_time() + timeout_us; if (!mc_handle) return MC_PARAM_ERROR; @@ -1992,7 +2065,7 @@ ERROR: return FALSE; } -mc_ret_e _mc_gst_create_pipeline(mc_gst_core_t *core, gchar *factory_name) +mc_ret_e _mc_gst_create_pipeline(mc_gst_core_t *core, const gchar *factory_name) { GstBus *bus = NULL; @@ -2368,7 +2441,7 @@ GstMCBuffer *_mc_gst_media_packet_to_gstbuffer(mc_gst_core_t *core, media_packet * will not be invoked */ gst_buffer_unref(mcbuffer->buffer); - free(mcbuffer); + g_free(mcbuffer); return NULL; } @@ -2440,8 +2513,8 @@ int __mc_gst_create_eos_packet(media_format_h fmt, GstMCBuffer *mcbuffer) media_packet_h packet = NULL; MEDIACODEC_FENTER(); - if (media_packet_create_alloc(fmt, __mc_output_buffer_finalize_cb, mcbuffer, &packet)) { - LOGE("media_packet_create_alloc failed\n"); + if (media_packet_create(fmt, __mc_output_buffer_finalize_cb, mcbuffer, &packet)) { + LOGE("media_packet_create failed\n"); ret = MC_ERROR; goto ERROR; } @@ -2664,16 +2737,12 @@ static void __mc_input_buffer_finalize_cb(GstMCBuffer *mcbuffer) return; LOGD("============>>>>> _finalize_cb : %p, %p", mcbuffer, mcbuffer->packet); - mc_gst_core_t *core = (mc_gst_core_t *)mcbuffer->core; - _mc_gst_handle_input_buffer_used(core, mcbuffer->packet); + _mc_gst_handle_input_buffer_used(mcbuffer->core, mcbuffer->packet); g_free(mcbuffer); - mcbuffer = NULL; MEDIACODEC_FLEAVE(); - - return; } static GstMCBuffer *gst_mediacodec_buffer_new(mc_gst_core_t *core, media_packet_h packet, uint64_t size) @@ -3339,8 +3408,14 @@ int _mc_get_mime(mc_gst_core_t *core) case MEDIACODEC_AMR_WB: mime = MEDIA_FORMAT_AMR_WB; break; + case MEDIACODEC_OPUS: + if (core->encoder) + mime = MEDIA_FORMAT_OPUS; + else + mime = MEDIA_FORMAT_PCM_S16LE; + break; default: - LOGE("NOT SUPPORTED!!!!"); + LOGE("NOT SUPPORTED!!!! 0x%x ", core->codec_id); break; } return mime;