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>
28 #include <media_codec_spec_emul.h>
30 static mc_codec_spec_t spec_emul[MEDIA_CODEC_MAX_CODEC_TYPE];
32 int mc_create(MMHandleType *mediacodec)
34 mc_handle_t *new_mediacodec = NULL;
35 int ret = MC_ERROR_NONE;
37 int support_list = sizeof(spec_emul) / sizeof(spec_emul[0]);
39 /* alloc mediacodec structure */
40 new_mediacodec = (mc_handle_t *)g_malloc(sizeof(mc_handle_t));
42 if (!new_mediacodec) {
43 LOGE("Cannot allocate memory for mediacodec");
47 memset(new_mediacodec, 0, sizeof(mc_handle_t));
48 memset(spec_emul, 0, sizeof(mc_codec_spec_t)*MEDIA_CODEC_MAX_CODEC_TYPE);
50 new_mediacodec->is_encoder = false;
51 new_mediacodec->is_video = false;
52 new_mediacodec->is_hw = true;
53 new_mediacodec->is_prepared = false;
54 new_mediacodec->codec_id = MEDIACODEC_NONE;
56 new_mediacodec->ports[0] = NULL;
57 new_mediacodec->ports[1] = NULL;
59 new_mediacodec->num_supported_codecs = 0;
60 new_mediacodec->num_supported_decoder = 0;
61 new_mediacodec->num_supported_encoder = 0;
63 new_mediacodec->core = NULL;
66 ret = mc_ini_load(&new_mediacodec->ini);
67 if(ret != MC_ERROR_NONE)
69 _mc_create_codec_map_from_ini(new_mediacodec, spec_emul);
71 for (i = 0; i < new_mediacodec->num_supported_codecs; i++) {
72 new_mediacodec->supported_codecs =
73 g_list_append(new_mediacodec->supported_codecs, GINT_TO_POINTER(spec_emul[i].codec_id));
76 /* create decoder map from ini */
77 _mc_create_decoder_map_from_ini(new_mediacodec);
79 /* create encoder map from ini */
80 _mc_create_encoder_map_from_ini(new_mediacodec);
82 *mediacodec = (MMHandleType)new_mediacodec;
88 return MC_INVALID_ARG;
91 int mc_destroy(MMHandleType mediacodec)
93 int ret = MC_ERROR_NONE;
94 mc_handle_t *mc_handle = (mc_handle_t *) mediacodec;
97 LOGE("fail invaild param\n");
98 return MC_INVALID_ARG;
101 LOGD("mediacodec : %p", mediacodec);
103 if (mc_handle->core != NULL) {
104 if (mc_gst_unprepare(mc_handle) != MC_ERROR_NONE) {
105 LOGE("mc_gst_unprepare() failed");
110 mc_handle->is_prepared = false;
111 g_list_free(mc_handle->supported_codecs);
113 /* free mediacodec structure */
115 g_free((void *)mc_handle);
122 int mc_set_codec(MMHandleType mediacodec, mediacodec_codec_type_e codec_id, mediacodec_support_type_e flags)
124 int ret = MC_ERROR_NONE;
125 mc_handle_t *mc_handle = (mc_handle_t *) mediacodec;
129 LOGE("fail invaild param");
130 return MC_INVALID_ARG;
133 /* Mandatory setting */
134 if (!GET_IS_ENCODER(flags) && !GET_IS_DECODER(flags)) {
135 LOGE("should be encoder or decoder");
136 return MC_PARAM_ERROR;
140 for (i = 0; i < mc_handle->num_supported_codecs; i++) {
141 if ((codec_id == spec_emul[i].codec_id) && (flags == spec_emul[i].codec_type)) {
145 LOGD("support_list : %d, i : %d", mc_handle->num_supported_codecs, i);
147 if (i == mc_handle->num_supported_codecs)
148 return MC_NOT_SUPPORTED;
150 mc_handle->port_type = spec_emul[i].port_type;
152 mc_handle->is_encoder = GET_IS_ENCODER(flags) ? 1 : 0;
153 mc_handle->is_hw = GET_IS_HW(flags) ? 1 : 0;
154 mc_handle->codec_id = codec_id;
155 mc_handle->is_video = CHECK_BIT(codec_id, 13);
157 mc_handle->is_prepared = false;
159 LOGD("encoder : %d, hardware : %d, codec_id : %x, video : %d",
160 mc_handle->is_encoder, mc_handle->is_hw, mc_handle->codec_id, mc_handle->is_video);
165 int mc_set_vdec_info(MMHandleType mediacodec, int width, int height)
167 int ret = MC_ERROR_NONE;
168 mc_handle_t* mc_handle = (mc_handle_t *)mediacodec;
171 LOGE("fail invaild param\n");
172 return MC_INVALID_ARG;
175 if ((width <= 0) || (height <= 0))
176 return MC_PARAM_ERROR;
178 MEDIACODEC_CHECK_CONDITION(mc_handle->codec_id && mc_handle->is_video && !mc_handle->is_encoder,
179 MEDIACODEC_ERROR_INVALID_PARAMETER, "MEDIACODEC_ERROR_INVALID_PARAMETER");
181 mc_handle->info.decoder.width = width;
182 mc_handle->info.decoder.height = height;
184 mc_handle->is_prepared = true;
186 switch (mc_handle->codec_id) {
187 case MEDIACODEC_H264:
188 mc_sniff_bitstream = mc_sniff_h264_bitstream;
189 LOGD("mc_sniff_h264_bitstream");
191 case MEDIACODEC_MPEG4:
192 mc_sniff_bitstream = mc_sniff_mpeg4_bitstream;
194 case MEDIACODEC_H263:
195 mc_sniff_bitstream = mc_sniff_h263_bitstream;
198 LOGE("NOT SUPPORTED!!!!");
205 int mc_set_venc_info(MMHandleType mediacodec, int width, int height, int fps, int target_bits)
207 int ret = MC_ERROR_NONE;
208 mc_handle_t *mc_handle = (mc_handle_t *) mediacodec;
211 LOGE("fail invaild param\n");
212 return MC_INVALID_ARG;
215 if ((width <= 0) || (height <= 0))
216 return MC_PARAM_ERROR;
218 MEDIACODEC_CHECK_CONDITION(mc_handle->codec_id && mc_handle->is_video && mc_handle->is_encoder,
219 MEDIACODEC_ERROR_INVALID_PARAMETER, "MEDIACODEC_ERROR_INVALID_PARAMETER");
221 mc_handle->info.encoder.width = width;
222 mc_handle->info.encoder.height = height;
223 mc_handle->info.encoder.fps = fps;
224 mc_handle->info.encoder.bitrate = target_bits;
225 mc_handle->is_prepared = true;
226 mc_sniff_bitstream = mc_sniff_yuv;
231 int mc_set_adec_info(MMHandleType mediacodec, int samplerate, int channel, int bit)
233 int ret = MC_ERROR_NONE;
234 mc_handle_t *mc_handle = (mc_handle_t *) mediacodec;
237 LOGE("fail invaild param\n");
238 return MC_INVALID_ARG;
241 if ((samplerate <= 0) || (channel <= 0) || (bit <= 0))
242 return MC_PARAM_ERROR;
244 MEDIACODEC_CHECK_CONDITION(mc_handle->codec_id && !mc_handle->is_video && !mc_handle->is_encoder,
245 MEDIACODEC_ERROR_INVALID_PARAMETER, "MEDIACODEC_ERROR_INVALID_PARAMETER");
247 mc_handle->info.decoder.samplerate = samplerate;
248 mc_handle->info.decoder.channel = channel;
249 mc_handle->info.decoder.bit = bit;
250 mc_handle->is_prepared = true;
255 int mc_set_aenc_info(MMHandleType mediacodec, int samplerate, int channel, int bit, int bitrate)
257 int ret = MC_ERROR_NONE;
258 mc_handle_t * mc_handle = (mc_handle_t *) mediacodec;
261 LOGE("fail invaild param\n");
262 return MC_INVALID_ARG;
265 if ((samplerate <= 0) || (channel <= 0) || (bit <= 0))
266 return MC_PARAM_ERROR;
268 MEDIACODEC_CHECK_CONDITION(mc_handle->codec_id && !mc_handle->is_video && mc_handle->is_encoder,
269 MEDIACODEC_ERROR_INVALID_PARAMETER, "MEDIACODEC_ERROR_INVALID_PARAMETER");
271 mc_handle->info.encoder.samplerate = samplerate;
272 mc_handle->info.encoder.channel = channel;
273 mc_handle->info.encoder.bit = bit;
274 mc_handle->info.encoder.bitrate = bitrate;
276 mc_handle->is_prepared = true;
281 int mc_prepare(MMHandleType mediacodec)
283 int ret = MC_ERROR_NONE;
284 mc_handle_t *mc_handle = (mc_handle_t *) mediacodec;
287 LOGE("fail invaild param\n");
288 return MC_INVALID_ARG;
291 if (!mc_handle->is_prepared)
292 return MC_NOT_INITIALIZED;
294 /* setting core details */
295 switch (mc_handle->port_type) {
296 case MEDIACODEC_PORT_TYPE_GENERAL:
301 case MEDIACODEC_PORT_TYPE_OMX:
306 case MEDIACODEC_PORT_TYPE_GST:
308 mc_gst_prepare(mc_handle);
319 int mc_unprepare(MMHandleType mediacodec)
321 int ret = MC_ERROR_NONE;
322 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
325 LOGE("fail invaild param\n");
326 return MC_INVALID_ARG;
329 /* deinit core details */
330 switch (mc_handle->port_type) {
331 case MEDIACODEC_PORT_TYPE_GENERAL:
336 case MEDIACODEC_PORT_TYPE_OMX:
341 case MEDIACODEC_PORT_TYPE_GST:
343 ret = mc_gst_unprepare(mc_handle);
354 int mc_process_input(MMHandleType mediacodec, media_packet_h inbuf, uint64_t timeOutUs)
356 int ret = MC_ERROR_NONE;
358 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
361 LOGE("fail invaild param");
362 return MC_INVALID_ARG;
365 if (mc_handle->is_video) {
366 if ((ret = mc_sniff_bitstream(mc_handle, inbuf)) != MC_ERROR_NONE) {
367 return MC_INVALID_IN_BUF;
371 switch (mc_handle->port_type) {
372 case MEDIACODEC_PORT_TYPE_GENERAL:
375 case MEDIACODEC_PORT_TYPE_OMX:
378 case MEDIACODEC_PORT_TYPE_GST:
380 ret = mc_gst_process_input(mc_handle, inbuf, timeOutUs);
391 int mc_get_output(MMHandleType mediacodec, media_packet_h *outbuf, uint64_t timeOutUs)
393 int ret = MC_ERROR_NONE;
394 mc_handle_t *mc_handle = (mc_handle_t *) mediacodec;
397 LOGE("fail invaild param\n");
398 return MC_INVALID_ARG;
401 /* setting core details */
402 switch (mc_handle->port_type) {
403 case MEDIACODEC_PORT_TYPE_GENERAL:
406 case MEDIACODEC_PORT_TYPE_OMX:
409 case MEDIACODEC_PORT_TYPE_GST:
411 ret = mc_gst_get_output(mc_handle, outbuf, timeOutUs);
422 int mc_flush_buffers(MMHandleType mediacodec)
424 int ret = MC_ERROR_NONE;
425 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
428 LOGE("fail invaild param\n");
429 return MC_INVALID_ARG;
432 /* setting core details */
433 switch (mc_handle->port_type) {
434 case MEDIACODEC_PORT_TYPE_GENERAL:
437 case MEDIACODEC_PORT_TYPE_OMX:
440 case MEDIACODEC_PORT_TYPE_GST:
442 ret = mc_gst_flush_buffers(mc_handle);
453 int mc_get_supported_type(MMHandleType mediacodec, mediacodec_codec_type_e codec_type, bool encoder, int *support_type)
455 int ret = MC_ERROR_NONE;
456 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
457 mc_codec_map_t *codec_map;
458 int num_supported_codec = 0;
464 LOGE("fail invaild param\n");
465 return MC_INVALID_ARG;
467 codec_map = encoder ? mc_handle->encoder_map : mc_handle->decoder_map;
468 num_supported_codec = encoder ? mc_handle->num_supported_encoder : mc_handle->num_supported_decoder;
470 for (i = 0; i < num_supported_codec; i++)
472 if (codec_map[i].id == codec_type)
474 if (codec_map[i].hardware)
475 *support_type |= MEDIACODEC_SUPPORT_TYPE_HW;
477 *support_type |= MEDIACODEC_SUPPORT_TYPE_SW;
486 int mc_set_empty_buffer_cb(MMHandleType mediacodec, mediacodec_input_buffer_used_cb callback, void *user_data)
488 int ret = MC_ERROR_NONE;
489 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
492 LOGE("fail invaild param\n");
493 return MC_INVALID_ARG;
496 if (mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_EMPTYBUFFER]) {
497 LOGE("Already set mediacodec_empty_buffer_cb");
498 return MC_PARAM_ERROR;
501 return MC_INVALID_ARG;
504 LOGD("Set empty buffer callback(cb = %p, data = %p)", callback, user_data);
506 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_EMPTYBUFFER] = (mc_empty_buffer_cb) callback;
507 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_EMPTYBUFFER] = user_data;
509 return MC_ERROR_NONE;
515 int mc_unset_empty_buffer_cb(MMHandleType mediacodec)
517 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
520 LOGE("fail invaild param\n");
521 return MC_INVALID_ARG;
524 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_EMPTYBUFFER] = NULL;
525 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_EMPTYBUFFER] = NULL;
527 return MC_ERROR_NONE;
530 int mc_set_fill_buffer_cb(MMHandleType mediacodec, mediacodec_output_buffer_available_cb callback, void *user_data)
532 int ret = MC_ERROR_NONE;
533 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
536 LOGE("fail invaild param\n");
537 return MC_INVALID_ARG;
540 if (mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_FILLBUFFER]) {
541 LOGE("Already set mediacodec_fill_buffer_cb");
542 return MC_PARAM_ERROR;
545 return MC_INVALID_ARG;
548 LOGD("Set fill buffer callback(cb = %p, data = %p)", callback, user_data);
550 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_FILLBUFFER] = (mc_fill_buffer_cb) callback;
551 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_FILLBUFFER] = user_data;
552 return MC_ERROR_NONE;
558 int mc_unset_fill_buffer_cb(MMHandleType mediacodec)
560 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
563 LOGE("fail invaild param\n");
564 return MC_INVALID_ARG;
567 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_FILLBUFFER] = NULL;
568 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_FILLBUFFER] = NULL;
570 return MC_ERROR_NONE;
573 int mc_set_error_cb(MMHandleType mediacodec, mediacodec_error_cb callback, void *user_data)
575 int ret = MC_ERROR_NONE;
576 mc_handle_t *mc_handle = (mc_handle_t *) mediacodec;
579 LOGE("fail invaild param\n");
580 return MC_INVALID_ARG;
583 if (mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_ERROR]) {
584 LOGE("Already set mediacodec_fill_buffer_cb\n");
585 return MC_PARAM_ERROR;
588 return MC_INVALID_ARG;
591 LOGD("Set event handler callback(cb = %p, data = %p)\n", callback, user_data);
593 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_ERROR] = (mc_error_cb) callback;
594 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_ERROR] = user_data;
595 return MC_ERROR_NONE;
601 int mc_unset_error_cb(MMHandleType mediacodec)
603 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
606 LOGE("fail invaild param");
607 return MC_INVALID_ARG;
610 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_ERROR] = NULL;
611 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_ERROR] = NULL;
613 return MC_ERROR_NONE;
616 int mc_set_eos_cb(MMHandleType mediacodec, mediacodec_eos_cb callback, void *user_data)
618 int ret = MC_ERROR_NONE;
619 mc_handle_t *mc_handle = (mc_handle_t *) mediacodec;
622 LOGE("fail invaild param\n");
623 return MC_INVALID_ARG;
626 if (mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_EOS]) {
627 LOGE("Already set mediacodec_fill_buffer_cb");
628 return MC_PARAM_ERROR;
631 return MC_INVALID_ARG;
634 LOGD("Set event handler callback(cb = %p, data = %p)\n", callback, user_data);
636 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_EOS] = (mc_eos_cb) callback;
637 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_EOS] = user_data;
638 return MC_ERROR_NONE;
644 int mc_unset_eos_cb(MMHandleType mediacodec)
646 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
649 LOGE("fail invaild param\n");
650 return MC_INVALID_ARG;
653 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_EOS] = NULL;
654 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_EOS] = NULL;
656 return MC_ERROR_NONE;
659 int mc_set_buffer_status_cb(MMHandleType mediacodec, mediacodec_buffer_status_cb callback, void *user_data)
661 int ret = MC_ERROR_NONE;
662 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
665 LOGE("fail invaild param\n");
666 return MC_INVALID_ARG;
669 if (mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_BUFFER_STATUS]) {
670 LOGE("Already set mediacodec_need_data_cb\n");
671 return MC_PARAM_ERROR;
674 return MC_INVALID_ARG;
677 LOGD("Set start feed callback(cb = %p, data = %p)\n", callback, user_data);
679 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_BUFFER_STATUS] = (mc_buffer_status_cb) callback;
680 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_BUFFER_STATUS] = user_data;
681 return MC_ERROR_NONE;
687 int mc_unset_buffer_status_cb(MMHandleType mediacodec)
689 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
692 LOGE("fail invaild param\n");
693 return MC_INVALID_ARG;
696 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_BUFFER_STATUS] = NULL;
697 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_BUFFER_STATUS] = NULL;
699 return MC_ERROR_NONE;
702 int mc_set_supported_codec_cb(MMHandleType mediacodec, mediacodec_supported_codec_cb callback, void *user_data)
704 int ret = MC_ERROR_NONE;
705 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
708 LOGE("fail invaild param\n");
709 return MC_INVALID_ARG;
712 if (mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_SUPPORTED_CODEC]) {
713 LOGE("Already set mediacodec_supported_codec_cb\n");
714 return MC_PARAM_ERROR;
717 return MC_INVALID_ARG;
720 LOGD("Set event handler callback(cb = %p, data = %p)", callback, user_data);
722 mc_handle->user_cb[_MEDIACODEC_EVENT_TYPE_SUPPORTED_CODEC] = (mc_supported_codec_cb) callback;
723 mc_handle->user_data[_MEDIACODEC_EVENT_TYPE_SUPPORTED_CODEC] = user_data;
724 return MC_ERROR_NONE;
730 int _mediacodec_foreach_supported_codec(MMHandleType mediacodec, mediacodec_supported_codec_cb callback, void *user_data)
732 int ret = MC_ERROR_NONE;
733 mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
738 LOGE("fail invaild param\n");
739 return MC_INVALID_ARG;
742 if (mc_handle->supported_codecs) {
743 codecs_num = g_list_length(mc_handle->supported_codecs);
744 LOGD("supported_codecs : %d", codecs_num);
747 tmp = g_list_nth_data(mc_handle->supported_codecs, codecs_num - 1);
749 if (!callback(GPOINTER_TO_INT(tmp), user_data)) {
750 ret = MEDIACODEC_ERROR_INTERNAL;
757 if (!callback(-1, user_data)) {
758 ret = MEDIACODEC_ERROR_INTERNAL;
764 LOGD("foreach callback returned error");
768 int mc_sniff_h264_bitstream(mc_handle_t *handle, media_packet_h pkt)
770 int ret = MC_ERROR_NONE;
771 void *buf_data = NULL;
772 void *codec_data = NULL;
773 unsigned int codec_data_size = 0;
774 uint64_t buf_size = 0;
776 bool codec_config = false;
778 media_packet_get_buffer_size(pkt, &buf_size);
779 media_packet_get_buffer_data_ptr(pkt, &buf_data);
780 media_packet_get_codec_data(pkt, &codec_data, &codec_data_size);
781 media_packet_is_end_of_stream(pkt, &eos);
782 media_packet_is_codec_config(pkt, &codec_config);
784 LOGD("codec_data_size : %d, buf_size : %d, codec_config : %d, eos : %d",
785 codec_data_size, (int)buf_size, codec_config, eos);
788 if (codec_data_size == 0)
789 ret = _mc_check_h264_bytestream(buf_data, (int)buf_size, 0, NULL, NULL, NULL);
795 int mc_sniff_mpeg4_bitstream(mc_handle_t *handle, media_packet_h pkt)
797 uint64_t buf_size = 0;
798 unsigned char *buf_data = NULL;
799 void *codec_data = NULL;
800 int codec_data_size = 0, voss_size = 0;
802 bool codec_config = false;
803 bool sync_frame = false;
805 media_packet_get_buffer_size(pkt, &buf_size);
806 media_packet_get_buffer_data_ptr(pkt, (void *)&buf_data);
807 media_packet_get_codec_data(pkt, &codec_data, &codec_data_size);
808 media_packet_is_end_of_stream(pkt, &eos);
809 media_packet_is_codec_config(pkt, &codec_config);
810 media_packet_is_sync_frame(pkt, &sync_frame);
812 LOGD("codec_data_size : %d, buff_size : %d, codec_config : %d, sync_frame : %d, eos : %d",
813 codec_data_size, (int)buf_size, codec_config, sync_frame, eos);
816 return MC_ERROR_NONE;
820 if (!_mc_is_voss(codec_data, codec_data_size, NULL))/*voss not in codec data */
821 return MC_INVALID_IN_BUF;
823 /* Codec data + I-frame in buffer */
824 if (_mc_is_voss(buf_data, buf_size, &voss_size)) {
825 if (_mc_is_ivop(buf_data, buf_size, voss_size)) /* IVOP after codec_data */
826 return MC_ERROR_NONE;
828 if (_mc_is_ivop(buf_data, buf_size, 0)) /* IVOP at the start */
829 return MC_ERROR_NONE;
831 } else if (_mc_is_vop(buf_data, buf_size, 0))
832 return MC_ERROR_NONE;
834 return MC_INVALID_IN_BUF;
837 int mc_sniff_h263_bitstream(mc_handle_t *handle, media_packet_h pkt)
839 void *buf_data = NULL;
840 uint64_t buf_size = 0;
843 media_packet_get_buffer_size(pkt, &buf_size);
844 media_packet_get_buffer_data_ptr(pkt, &buf_data);
845 media_packet_is_end_of_stream(pkt, &eos);
848 return MC_ERROR_NONE;
850 return _mc_check_valid_h263_frame((unsigned char *)buf_data, (int)buf_size);
853 int mc_sniff_yuv(mc_handle_t *handle, media_packet_h pkt)
855 int ret = MC_ERROR_NONE;
857 #if 0 /* libtbm, media-tool should be updated */
858 uint64_t buf_size = 0;
860 int padded_width = 0;
861 int padded_height = 0;
862 int allocated_buffer = 0;
865 media_packet_get_buffer_size(pkt, &buf_size);
866 media_packet_get_video_number_of_planes(pkt, &plane_num);
868 for (index = 0; index < plane_num; index++) {
869 media_packet_get_video_stride_width(pkt, index, &padded_width);
870 media_packet_get_video_stride_height(pkt, index, &padded_height);
871 allocated_buffer += padded_width * padded_height;
873 LOGD("%d plane size : %d", padded_width * padded_height);
876 if (buf_size > allocated_buffer) {
877 LOGE("Buffer exceeds maximum size [buf_size: %d, allocated_size :%d", (int)buf_size, allocated_buffer);
878 ret = MC_INVALID_IN_BUF;