2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
23 #include <media_codec.h>
24 #include <media_codec_private.h>
25 #include <media_codec_port.h>
26 #include <media_codec_port_gst.h>
27 #include <media_codec_spec_emul.h>
28 #include <media_codec_ini.h>
30 int mc_create(MMHandleType *mediacodec)
32 mc_handle_t *new_mediacodec = NULL;
33 int ret = MC_ERROR_NONE;
35 /* alloc mediacodec structure */
36 new_mediacodec = (mc_handle_t *)g_malloc(sizeof(mc_handle_t));
38 if (!new_mediacodec) {
39 LOGE("Cannot allocate memory for mediacodec");
43 memset(new_mediacodec, 0, sizeof(mc_handle_t));
45 new_mediacodec->is_encoder = false;
46 new_mediacodec->is_video = false;
47 new_mediacodec->is_hw = true;
48 new_mediacodec->is_prepared = false;
49 new_mediacodec->codec_id = MEDIACODEC_NONE;
51 new_mediacodec->ports[0] = NULL;
52 new_mediacodec->ports[1] = NULL;
54 new_mediacodec->num_supported_decoder = 0;
55 new_mediacodec->num_supported_encoder = 0;
57 new_mediacodec->core = NULL;
58 new_mediacodec->ini = &mc_ini;
62 ret = mc_ini_load(&mc_ini);
63 if (ret != MC_ERROR_NONE)
69 _mc_create_codec_map_from_ini(new_mediacodec, spec_emul);
71 /* create decoder map from ini */
72 _mc_create_decoder_map_from_ini(new_mediacodec);
74 /* create encoder map from ini */
75 _mc_create_encoder_map_from_ini(new_mediacodec);
77 *mediacodec = (MMHandleType)new_mediacodec;
82 g_free(new_mediacodec);
83 return MC_INVALID_ARG;
86 int mc_destroy(MMHandleType mediacodec)
88 int ret = MC_ERROR_NONE;
89 mc_handle_t *mc_handle = (mc_handle_t *) mediacodec;
92 LOGE("fail invaild param\n");
93 return MC_INVALID_ARG;
96 LOGD("mediacodec : %p", mediacodec);
98 if (mc_handle->core != NULL) {
99 if (mc_gst_unprepare(mc_handle) != MC_ERROR_NONE) {
100 LOGE("mc_gst_unprepare() failed");
105 mc_handle->is_prepared = false;
107 /* free mediacodec structure */
109 g_free((void *)mc_handle);
116 int mc_set_codec(MMHandleType mediacodec, mediacodec_codec_type_e codec_id, int flags)
118 int ret = MC_ERROR_NONE;
119 mc_handle_t *mc_handle = (mc_handle_t *) mediacodec;
123 LOGE("fail invaild param");
124 return MC_INVALID_ARG;
127 /* Mandatory setting */
128 if (!GET_IS_ENCODER(flags) && !GET_IS_DECODER(flags)) {
129 LOGE("should be encoder or decoder");
130 return MC_PARAM_ERROR;
133 /* if user doesn't set codec-type, s/w codec would be set */
134 if (!GET_IS_HW(flags) && !GET_IS_SW(flags))
135 flags |= MEDIACODEC_SUPPORT_TYPE_SW;
137 for (i = 0; i < mc_handle->ini->num_supported_codecs; i++) {
138 if ((codec_id == spec_emul[i].codec_id) && (flags == spec_emul[i].codec_type))
141 LOGD("support_list : %d, i : %d", mc_handle->ini->num_supported_codecs, i);
143 if (i == mc_handle->ini->num_supported_codecs)
144 return MC_NOT_SUPPORTED;
146 mc_handle->port_type = spec_emul[i].port_type;
148 mc_handle->is_encoder = GET_IS_ENCODER(flags) ? 1 : 0;
149 mc_handle->is_hw = GET_IS_HW(flags) ? 1 : 0;
150 mc_handle->codec_id = codec_id;
151 mc_handle->is_video = CHECK_BIT(codec_id, 13);
153 mc_handle->is_prepared = false;
155 LOGD("encoder : %d, hardware : %d, codec_id : %x, video : %d",
156 mc_handle->is_encoder, mc_handle->is_hw, mc_handle->codec_id, mc_handle->is_video);
161 int mc_set_vdec_info(MMHandleType mediacodec, int width, int height)
163 int ret = MC_ERROR_NONE;
164 mc_handle_t* mc_handle = (mc_handle_t *)mediacodec;
167 LOGE("fail invaild param\n");
168 return MC_INVALID_ARG;
171 if ((width <= 0) || (height <= 0))
172 return MC_PARAM_ERROR;
174 MEDIACODEC_CHECK_CONDITION(mc_handle->codec_id && mc_handle->is_video && !mc_handle->is_encoder,
175 MC_INVALID_ARG, "MEDIACODEC_ERROR_INVALID_PARAMETER");
177 mc_handle->info.decoder.width = width;
178 mc_handle->info.decoder.height = height;
180 mc_handle->is_prepared = true;
185 int mc_set_venc_info(MMHandleType mediacodec, int width, int height, int fps, int target_bits)
187 int ret = MC_ERROR_NONE;
188 mc_handle_t *mc_handle = (mc_handle_t *) mediacodec;
191 LOGE("fail invaild param\n");
192 return MC_INVALID_ARG;
195 if ((width <= 0) || (height <= 0))
196 return MC_PARAM_ERROR;
198 MEDIACODEC_CHECK_CONDITION(mc_handle->codec_id && mc_handle->is_video && mc_handle->is_encoder,
199 MC_INVALID_ARG, "MEDIACODEC_ERROR_INVALID_PARAMETER");
201 mc_handle->info.encoder.width = width;
202 mc_handle->info.encoder.height = height;
203 mc_handle->info.encoder.fps = fps;
204 mc_handle->info.encoder.bitrate = target_bits * 1000;
205 mc_handle->is_prepared = true;
210 int mc_set_adec_info(MMHandleType mediacodec, int samplerate, int channel, int bit)
212 int ret = MC_ERROR_NONE;
213 mc_handle_t *mc_handle = (mc_handle_t *) mediacodec;
216 LOGE("fail invaild param\n");
217 return MC_INVALID_ARG;
220 if ((samplerate <= 0) || (channel <= 0) || (bit <= 0))
221 return MC_PARAM_ERROR;
223 MEDIACODEC_CHECK_CONDITION(mc_handle->codec_id && !mc_handle->is_video && !mc_handle->is_encoder,
224 MC_INVALID_ARG, "MEDIACODEC_ERROR_INVALID_PARAMETER");
226 mc_handle->info.decoder.samplerate = samplerate;
227 mc_handle->info.decoder.channel = channel;
228 mc_handle->info.decoder.bit = bit;
229 mc_handle->is_prepared = true;
234 int mc_set_aenc_info(MMHandleType mediacodec, int samplerate, int channel, int bit, int bitrate)
236 int ret = MC_ERROR_NONE;
237 mc_handle_t * mc_handle = (mc_handle_t *) mediacodec;
240 LOGE("fail invaild param\n");
241 return MC_INVALID_ARG;
244 if ((samplerate <= 0) || (channel <= 0) || (bit <= 0))
245 return MC_PARAM_ERROR;
247 MEDIACODEC_CHECK_CONDITION(mc_handle->codec_id && !mc_handle->is_video && mc_handle->is_encoder,
248 MC_INVALID_ARG, "MEDIACODEC_ERROR_INVALID_PARAMETER");
250 mc_handle->info.encoder.samplerate = samplerate;
251 mc_handle->info.encoder.channel = channel;
252 mc_handle->info.encoder.bit = bit;
253 mc_handle->info.encoder.bitrate = bitrate * 1000;
255 mc_handle->is_prepared = true;
260 int mc_configure(MMHandleType mediacodec, media_format_h format, int flags)
262 int ret = MC_ERROR_NONE;
263 mc_handle_t *mc_handle = (mc_handle_t *) mediacodec;
265 const int codec_mask = 0xFFF0;
274 media_format_type_e type;
275 media_format_mimetype_e mimetype;
278 LOGE("fail invaild param");
279 return MC_INVALID_ARG;
282 if (media_format_get_type(format, &type) != MEDIA_FORMAT_ERROR_NONE) {
283 LOGE("failed to retrieve type");
284 return MC_INVALID_ARG;
287 if (type == MEDIA_FORMAT_AUDIO) {
288 media_format_get_audio_info(format, &mimetype, &channel, &samplerate, &bit, &bitrate);
290 if (GET_IS_ENCODER(flags)) {
291 if ((samplerate <= 0) || (channel <= 0) || (bit <= 0) || (bitrate <= 0)) {
292 LOGE("invalid pram is set : samplerate : %d, channel : %d, bit : %d, bitrate : %d",
293 samplerate, channel, bit, bitrate);
294 return MC_PARAM_ERROR;
297 mc_handle->info.encoder.samplerate = samplerate;
298 mc_handle->info.encoder.channel = channel;
299 mc_handle->info.encoder.bit = bit;
300 mc_handle->info.encoder.bitrate = bitrate * 1000;
301 } else if (GET_IS_DECODER(flags)) {
302 if ((samplerate <= 0) || (channel <= 0) || (bit <= 0)) {
303 LOGE("invalid pram is set : samplerate : %d, channel : %d, bit : %d",
304 samplerate, channel, bit);
305 return MC_PARAM_ERROR;
307 mc_handle->info.decoder.samplerate = samplerate;
308 mc_handle->info.decoder.channel = channel;
309 mc_handle->info.decoder.bit = bit;
311 LOGE("either an encoder or a decoder must be set");
312 return MC_PARAM_ERROR;
314 } else if (type == MEDIA_FORMAT_VIDEO) {
315 media_format_get_video_info(format, &mimetype, &width, &height, &bitrate, NULL);
316 media_format_get_video_frame_rate(format, &fps);
318 if (GET_IS_ENCODER(flags)) {
319 if ((width <= 0) || (height <= 0) || (bitrate <= 0) || (fps <= 0)) {
320 LOGE("invalid pram is set : width : %d, height : %d, bitrate : %d, fps : %d",
321 width, height, bitrate, fps);
322 return MC_PARAM_ERROR;
325 mc_handle->info.encoder.width = width;
326 mc_handle->info.encoder.height = height;
327 mc_handle->info.encoder.fps = fps;
328 mc_handle->info.encoder.bitrate = bitrate * 1000;
329 } else if (GET_IS_DECODER(flags)) {
330 if ((width <= 0) || (height <= 0)) {
331 LOGE("invalid pram is set : width : %d, height : %d",
333 return MC_PARAM_ERROR;
336 mc_handle->info.decoder.width = width;
337 mc_handle->info.decoder.height = height;
339 LOGE("either an encoder or a decoder must be set");
340 return MC_PARAM_ERROR;
343 LOGE("invalid format type is set");
344 return MC_PARAM_ERROR;
347 if (!GET_IS_HW(flags) && !GET_IS_SW(flags))
348 flags |= MEDIACODEC_SUPPORT_TYPE_SW;
350 codec_id = mimetype & codec_mask;
352 for (i = 0; i < mc_handle->ini->num_supported_codecs; i++) {
353 if ((codec_id == spec_emul[i].codec_id) && (flags == spec_emul[i].codec_type))
356 LOGD("support_list : %d, i : %d", mc_handle->ini->num_supported_codecs, i);
358 if (i == mc_handle->ini->num_supported_codecs)
359 return MC_CODEC_NOT_FOUND;
361 mc_handle->port_type = spec_emul[i].port_type;
363 mc_handle->is_encoder = GET_IS_ENCODER(flags) ? 1 : 0;
364 mc_handle->is_hw = GET_IS_HW(flags) ? 1 : 0;
365 mc_handle->codec_id = codec_id;
366 mc_handle->is_video = CHECK_BIT(codec_id, 13);
368 mc_handle->is_prepared = true;
370 LOGD("encoder : %d, hardware : %d, codec_id : %x, video : %d",
371 mc_handle->is_encoder, mc_handle->is_hw, mc_handle->codec_id, mc_handle->is_video);
376 int mc_prepare(MMHandleType mediacodec)
378 int ret = MC_ERROR_NONE;
379 mc_handle_t *mc_handle = (mc_handle_t *) mediacodec;
382 LOGE("fail invaild param\n");
383 return MC_INVALID_ARG;
386 if (!mc_handle->is_prepared)
387 return MC_NOT_INITIALIZED;
389 /* setting core details */
390 switch (mc_handle->port_type) {
391 case MEDIACODEC_PORT_TYPE_GENERAL:
394 case MEDIACODEC_PORT_TYPE_OMX:
397 case MEDIACODEC_PORT_TYPE_GST:
398 mc_gst_prepare(mc_handle);
408 int mc_unprepare(MMHandleType mediacodec)
410 int ret = MC_ERROR_NONE;
411 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
414 LOGE("fail invaild param\n");
415 return MC_INVALID_ARG;
418 /* deinit core details */
419 switch (mc_handle->port_type) {
420 case MEDIACODEC_PORT_TYPE_GENERAL:
423 case MEDIACODEC_PORT_TYPE_OMX:
426 case MEDIACODEC_PORT_TYPE_GST:
427 ret = mc_gst_unprepare(mc_handle);
437 int mc_process_input(MMHandleType mediacodec, media_packet_h inbuf, uint64_t timeOutUs)
439 int ret = MC_ERROR_NONE;
441 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
444 LOGE("fail invaild param");
445 return MC_INVALID_ARG;
449 LOGE("invaild input buffer");
450 return MC_INVALID_IN_BUF;
453 switch (mc_handle->port_type) {
454 case MEDIACODEC_PORT_TYPE_GENERAL:
457 case MEDIACODEC_PORT_TYPE_OMX:
460 case MEDIACODEC_PORT_TYPE_GST:
461 ret = mc_gst_process_input(mc_handle, inbuf, timeOutUs);
471 int mc_get_output(MMHandleType mediacodec, media_packet_h *outbuf, uint64_t timeOutUs)
473 int ret = MC_ERROR_NONE;
474 mc_handle_t *mc_handle = (mc_handle_t *) mediacodec;
477 LOGE("fail invaild param\n");
478 return MC_INVALID_ARG;
481 /* setting core details */
482 switch (mc_handle->port_type) {
483 case MEDIACODEC_PORT_TYPE_GENERAL:
486 case MEDIACODEC_PORT_TYPE_OMX:
489 case MEDIACODEC_PORT_TYPE_GST:
490 ret = mc_gst_get_output(mc_handle, outbuf, timeOutUs);
500 int mc_flush_buffers(MMHandleType mediacodec)
502 int ret = MC_ERROR_NONE;
503 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
506 LOGE("fail invaild param\n");
507 return MC_INVALID_ARG;
510 /* setting core details */
511 switch (mc_handle->port_type) {
512 case MEDIACODEC_PORT_TYPE_GENERAL:
515 case MEDIACODEC_PORT_TYPE_OMX:
518 case MEDIACODEC_PORT_TYPE_GST:
519 ret = mc_gst_flush_buffers(mc_handle);
529 int mc_get_supported_type(MMHandleType mediacodec, mediacodec_codec_type_e codec_type, bool encoder, int *support_type)
531 int ret = MC_ERROR_NONE;
532 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
533 mc_codec_map_t *codec_map;
534 int num_supported_codec = 0;
540 LOGE("fail invaild param\n");
541 return MC_INVALID_ARG;
544 codec_map = encoder ? mc_handle->encoder_map : mc_handle->decoder_map;
545 num_supported_codec = encoder ? mc_handle->num_supported_encoder : mc_handle->num_supported_decoder;
547 for (i = 0; i < num_supported_codec; i++) {
548 if (codec_map[i].id == codec_type) {
549 if (codec_map[i].hardware)
550 *support_type |= MEDIACODEC_SUPPORT_TYPE_HW;
552 *support_type |= MEDIACODEC_SUPPORT_TYPE_SW;
559 int mc_set_empty_buffer_cb(MMHandleType mediacodec, mediacodec_input_buffer_used_cb callback, void *user_data)
561 int ret = MC_ERROR_NONE;
562 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
565 LOGE("fail invaild param\n");
566 return MC_INVALID_ARG;
569 if (mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_EMPTYBUFFER]) {
570 LOGE("Already set mediacodec_empty_buffer_cb");
571 return MC_PARAM_ERROR;
574 return MC_INVALID_ARG;
576 LOGD("Set empty buffer callback(cb = %p, data = %p)", callback, user_data);
578 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_EMPTYBUFFER] = (mc_empty_buffer_cb) callback;
579 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_EMPTYBUFFER] = user_data;
581 return MC_ERROR_NONE;
587 int mc_unset_empty_buffer_cb(MMHandleType mediacodec)
589 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
592 LOGE("fail invaild param\n");
593 return MC_INVALID_ARG;
596 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_EMPTYBUFFER] = NULL;
597 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_EMPTYBUFFER] = NULL;
599 return MC_ERROR_NONE;
602 int mc_set_fill_buffer_cb(MMHandleType mediacodec, mediacodec_output_buffer_available_cb callback, void *user_data)
604 int ret = MC_ERROR_NONE;
605 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
608 LOGE("fail invaild param\n");
609 return MC_INVALID_ARG;
612 if (mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_FILLBUFFER]) {
613 LOGE("Already set mediacodec_fill_buffer_cb");
614 return MC_PARAM_ERROR;
617 return MC_INVALID_ARG;
619 LOGD("Set fill buffer callback(cb = %p, data = %p)", callback, user_data);
621 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_FILLBUFFER] = (mc_fill_buffer_cb) callback;
622 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_FILLBUFFER] = user_data;
623 return MC_ERROR_NONE;
629 int mc_unset_fill_buffer_cb(MMHandleType mediacodec)
631 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
634 LOGE("fail invaild param\n");
635 return MC_INVALID_ARG;
638 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_FILLBUFFER] = NULL;
639 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_FILLBUFFER] = NULL;
641 return MC_ERROR_NONE;
644 int mc_set_error_cb(MMHandleType mediacodec, mediacodec_error_cb callback, void *user_data)
646 int ret = MC_ERROR_NONE;
647 mc_handle_t *mc_handle = (mc_handle_t *) mediacodec;
650 LOGE("fail invaild param\n");
651 return MC_INVALID_ARG;
654 if (mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_ERROR]) {
655 LOGE("Already set mediacodec_fill_buffer_cb\n");
656 return MC_PARAM_ERROR;
659 return MC_INVALID_ARG;
661 LOGD("Set event handler callback(cb = %p, data = %p)\n", callback, user_data);
663 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_ERROR] = (mc_error_cb) callback;
664 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_ERROR] = user_data;
665 return MC_ERROR_NONE;
671 int mc_unset_error_cb(MMHandleType mediacodec)
673 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
676 LOGE("fail invaild param");
677 return MC_INVALID_ARG;
680 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_ERROR] = NULL;
681 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_ERROR] = NULL;
683 return MC_ERROR_NONE;
686 int mc_set_eos_cb(MMHandleType mediacodec, mediacodec_eos_cb callback, void *user_data)
688 int ret = MC_ERROR_NONE;
689 mc_handle_t *mc_handle = (mc_handle_t *) mediacodec;
692 LOGE("fail invaild param\n");
693 return MC_INVALID_ARG;
696 if (mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_EOS]) {
697 LOGE("Already set mediacodec_fill_buffer_cb");
698 return MC_PARAM_ERROR;
701 return MC_INVALID_ARG;
703 LOGD("Set event handler callback(cb = %p, data = %p)\n", callback, user_data);
705 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_EOS] = (mc_eos_cb) callback;
706 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_EOS] = user_data;
707 return MC_ERROR_NONE;
713 int mc_unset_eos_cb(MMHandleType mediacodec)
715 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
718 LOGE("fail invaild param\n");
719 return MC_INVALID_ARG;
722 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_EOS] = NULL;
723 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_EOS] = NULL;
725 return MC_ERROR_NONE;
728 int mc_set_buffer_status_cb(MMHandleType mediacodec, mediacodec_buffer_status_cb callback, void *user_data)
730 int ret = MC_ERROR_NONE;
731 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
734 LOGE("fail invaild param\n");
735 return MC_INVALID_ARG;
738 if (mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_BUFFER_STATUS]) {
739 LOGE("Already set mediacodec_need_data_cb\n");
740 return MC_PARAM_ERROR;
743 return MC_INVALID_ARG;
745 LOGD("Set start feed callback(cb = %p, data = %p)\n", callback, user_data);
747 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_BUFFER_STATUS] = (mc_buffer_status_cb) callback;
748 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_BUFFER_STATUS] = user_data;
749 return MC_ERROR_NONE;
755 int mc_unset_buffer_status_cb(MMHandleType mediacodec)
757 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
760 LOGE("fail invaild param\n");
761 return MC_INVALID_ARG;
764 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_BUFFER_STATUS] = NULL;
765 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_BUFFER_STATUS] = NULL;
767 return MC_ERROR_NONE;
770 int mc_set_supported_codec_cb(MMHandleType mediacodec, mediacodec_supported_codec_cb callback, void *user_data)
772 int ret = MC_ERROR_NONE;
773 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
776 LOGE("fail invaild param\n");
777 return MC_INVALID_ARG;
780 if (mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_SUPPORTED_CODEC]) {
781 LOGE("Already set mediacodec_supported_codec_cb\n");
782 return MC_PARAM_ERROR;
785 return MC_INVALID_ARG;
787 LOGD("Set event handler callback(cb = %p, data = %p)", callback, user_data);
789 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_SUPPORTED_CODEC] = (mc_supported_codec_cb) callback;
790 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_SUPPORTED_CODEC] = user_data;
791 return MC_ERROR_NONE;
797 int _mediacodec_foreach_supported_codec(mediacodec_supported_codec_cb callback, void *user_data)
799 int ret = MEDIACODEC_NONE;
803 gboolean codec[CODEC_NR_ITEMS] = {0,};
805 for (i = 0; i < mc_ini.num_supported_codecs; i++) {
806 index = (int)codec_type_to_simple_enumeration(spec_emul[i].codec_id);
810 for (i = 0; i < CODEC_NR_ITEMS; i++) {
812 index = (int)simple_to_codec_type_enumeration(i);
813 if (!callback(index, user_data))
818 if (!callback(-1, user_data)) {
819 ret = MEDIACODEC_ERROR_INTERNAL;
824 LOGD("foreach callback returned error");
828 int mc_get_packet_pool(MMHandleType mediacodec, media_packet_pool_h *pool)
830 int ret = MC_ERROR_NONE;
831 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
834 LOGE("fail invaild param\n");
835 return MC_INVALID_ARG;
838 /* setting core details */
839 switch (mc_handle->port_type) {
840 case MEDIACODEC_PORT_TYPE_GENERAL:
843 case MEDIACODEC_PORT_TYPE_OMX:
846 case MEDIACODEC_PORT_TYPE_GST:
847 ret = mc_gst_get_packet_pool(mc_handle, pool);
857 void _mc_create_decoder_map_from_ini(mc_handle_t *mediacodec)
859 int indx = 0, count = 0;
860 int codec_list = mediacodec->ini->codec_list;
861 for (indx = 0; indx < codec_list; indx++) {
862 if (strcmp(mediacodec->ini->codec[indx].codec_info[0].name, "")) {
863 mediacodec->decoder_map[count].id = mediacodec->ini->codec[indx].codec_id;
864 mediacodec->decoder_map[count].hardware = 1; /* hardware */
865 mediacodec->decoder_map[count].type.factory_name = mediacodec->ini->codec[indx].codec_info[0].name;
866 mediacodec->decoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[0].mime;
867 mediacodec->decoder_map[count].type.out_format =
868 _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[0].format);
872 if (strcmp(mediacodec->ini->codec[indx].codec_info[2].name, "")) {
873 mediacodec->decoder_map[count].id = mediacodec->ini->codec[indx].codec_id;
874 mediacodec->decoder_map[count].hardware = 0; /* software */
875 mediacodec->decoder_map[count].type.factory_name = mediacodec->ini->codec[indx].codec_info[2].name;
876 mediacodec->decoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[2].mime;
877 mediacodec->decoder_map[count].type.out_format =
878 _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[2].format);
882 mediacodec->num_supported_decoder = count;
887 void _mc_create_encoder_map_from_ini(mc_handle_t *mediacodec)
889 int indx = 0, count = 0;
890 int codec_list = mediacodec->ini->codec_list;
892 for (indx = 0; indx < codec_list; indx++) {
893 if (strcmp(mediacodec->ini->codec[indx].codec_info[1].name, "")) {
894 mediacodec->encoder_map[count].id = mediacodec->ini->codec[indx].codec_id;
895 mediacodec->encoder_map[count].hardware = 1;
896 mediacodec->encoder_map[count].type.factory_name = mediacodec->ini->codec[indx].codec_info[1].name;
897 mediacodec->encoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[1].mime;
898 mediacodec->encoder_map[count].type.out_format =
899 _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[1].format);
903 if (strcmp(mediacodec->ini->codec[indx].codec_info[3].name, "")) {
904 mediacodec->encoder_map[count].id = mediacodec->ini->codec[indx].codec_id;
905 mediacodec->encoder_map[count].hardware = 0;
906 mediacodec->encoder_map[count].type.factory_name = mediacodec->ini->codec[indx].codec_info[3].name;
907 mediacodec->encoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[3].mime;
908 mediacodec->encoder_map[count].type.out_format =
909 _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[3].format);
913 mediacodec->num_supported_encoder = count;
917 void _mc_create_codec_map_from_ini(mc_handle_t *mediacodec, mc_codec_spec_t *spec_emul)
919 int indx = 0, count = 0;
920 int codec_list = mediacodec->ini->codec_list;
922 for (indx = 0; indx < codec_list; indx++) {
923 if (strcmp(mediacodec->ini->codec[indx].codec_info[0].name, "")) {
924 spec_emul[count].codec_id = mediacodec->ini->codec[indx].codec_id;
925 spec_emul[count].codec_type = MEDIACODEC_DECODER | MEDIACODEC_SUPPORT_TYPE_HW;
926 spec_emul[count].port_type = MEDIACODEC_PORT_TYPE_GST;
929 if (strcmp(mediacodec->ini->codec[indx].codec_info[1].name, "")) {
930 spec_emul[count].codec_id = mediacodec->ini->codec[indx].codec_id;
931 spec_emul[count].codec_type = MEDIACODEC_ENCODER | MEDIACODEC_SUPPORT_TYPE_HW;
932 spec_emul[count].port_type = MEDIACODEC_PORT_TYPE_GST;
935 if (strcmp(mediacodec->ini->codec[indx].codec_info[2].name, "")) {
936 spec_emul[count].codec_id = mediacodec->ini->codec[indx].codec_id;
937 spec_emul[count].codec_type = MEDIACODEC_DECODER | MEDIACODEC_SUPPORT_TYPE_SW;
938 spec_emul[count].port_type = MEDIACODEC_PORT_TYPE_GST;
941 if (strcmp(mediacodec->ini->codec[indx].codec_info[3].name, "")) {
942 spec_emul[count].codec_id = mediacodec->ini->codec[indx].codec_id;
943 spec_emul[count].codec_type = MEDIACODEC_ENCODER | MEDIACODEC_SUPPORT_TYPE_SW;
944 spec_emul[count].port_type = MEDIACODEC_PORT_TYPE_GST;
949 mediacodec->ini->num_supported_codecs = count;
950 LOGE("supported codecs :%d", count);
954 void _mc_create_codec_map_from_ini_static(mc_ini_t *ini, mc_codec_spec_t *spec_emul)
956 int indx = 0, count = 0;
957 int codec_list = ini->codec_list;
959 for (indx = 0; indx < codec_list; indx++) {
960 if (strcmp(ini->codec[indx].codec_info[0].name, "")) {
961 spec_emul[count].codec_id = ini->codec[indx].codec_id;
962 spec_emul[count].codec_type = MEDIACODEC_DECODER | MEDIACODEC_SUPPORT_TYPE_HW;
963 spec_emul[count].port_type = MEDIACODEC_PORT_TYPE_GST;
966 if (strcmp(ini->codec[indx].codec_info[1].name, "")) {
967 spec_emul[count].codec_id = ini->codec[indx].codec_id;
968 spec_emul[count].codec_type = MEDIACODEC_ENCODER | MEDIACODEC_SUPPORT_TYPE_HW;
969 spec_emul[count].port_type = MEDIACODEC_PORT_TYPE_GST;
972 if (strcmp(ini->codec[indx].codec_info[2].name, "")) {
973 spec_emul[count].codec_id = ini->codec[indx].codec_id;
974 spec_emul[count].codec_type = MEDIACODEC_DECODER | MEDIACODEC_SUPPORT_TYPE_SW;
975 spec_emul[count].port_type = MEDIACODEC_PORT_TYPE_GST;
978 if (strcmp(ini->codec[indx].codec_info[3].name, "")) {
979 spec_emul[count].codec_id = ini->codec[indx].codec_id;
980 spec_emul[count].codec_type = MEDIACODEC_ENCODER | MEDIACODEC_SUPPORT_TYPE_SW;
981 spec_emul[count].port_type = MEDIACODEC_PORT_TYPE_GST;
986 ini->num_supported_codecs = count;
987 LOGE("supported codecs :%d", count);
991 const codec_type_e codec_type_to_simple_enumeration(mediacodec_codec_type_e media_codec_id)
993 guint media_codec_id_u = (guint)media_codec_id;
995 switch (media_codec_id_u) {
998 case MEDIACODEC_ALAW:
1000 case MEDIACODEC_ULAW:
1002 case MEDIACODEC_AMR_NB:
1004 case MEDIACODEC_AMR_WB:
1006 case MEDIACODEC_G729:
1008 case MEDIACODEC_AAC_LC:
1010 case MEDIACODEC_AAC_HE:
1012 case MEDIACODEC_AAC_HE_PS:
1014 case MEDIACODEC_MP3:
1016 case MEDIACODEC_VORBIS:
1018 case MEDIACODEC_FLAC:
1020 case MEDIACODEC_WMAV1:
1022 case MEDIACODEC_WMAV2:
1024 case MEDIACODEC_WMAPRO:
1026 case MEDIACODEC_WMALSL:
1028 case MEDIACODEC_H261:
1030 case MEDIACODEC_H263:
1032 case MEDIACODEC_H264:
1034 case MEDIACODEC_MJPEG:
1036 case MEDIACODEC_MPEG1:
1038 case MEDIACODEC_MPEG2:
1040 case MEDIACODEC_MPEG4:
1042 case MEDIACODEC_HEVC:
1044 case MEDIACODEC_VP8:
1046 case MEDIACODEC_VP9:
1048 case MEDIACODEC_VC1:
1055 const codec_type_e simple_to_codec_type_enumeration(codec_type_e codec_id)
1057 guint codec_id_u = (guint)codec_id;
1059 switch (codec_id_u) {
1061 return MEDIACODEC_L16;
1063 return MEDIACODEC_ALAW;
1065 return MEDIACODEC_ULAW;
1067 return MEDIACODEC_AMR_NB;
1069 return MEDIACODEC_AMR_WB;
1071 return MEDIACODEC_G729;
1073 return MEDIACODEC_AAC_LC;
1075 return MEDIACODEC_AAC_HE;
1077 return MEDIACODEC_AAC_HE_PS;
1079 return MEDIACODEC_MP3;
1081 return MEDIACODEC_VORBIS;
1083 return MEDIACODEC_FLAC;
1085 return MEDIACODEC_WMAV1;
1087 return MEDIACODEC_WMAV2;
1089 return MEDIACODEC_WMAPRO;
1091 return MEDIACODEC_WMALSL;
1093 return MEDIACODEC_H261;
1095 return MEDIACODEC_H263;
1097 return MEDIACODEC_H264;
1099 return MEDIACODEC_MJPEG;
1101 return MEDIACODEC_MPEG1;
1103 return MEDIACODEC_MPEG2;
1105 return MEDIACODEC_MPEG4;
1107 return MEDIACODEC_HEVC;
1109 return MEDIACODEC_VP8;
1111 return MEDIACODEC_VP9;
1113 return MEDIACODEC_VC1;