+
+ /* get packet pool instance */
+ ret = mediacodec_get_packet_pool(app->mc_handle[0], &pkt_pool);
+ if (ret != MEDIA_PACKET_ERROR_NONE) {
+ g_print("mediacodec_get_packet_pool failed\n");
+ return;
+ }
+ g_print("\n\nmediacodec start\n\n");
+
+ return;
+}
+
+void _mediacodec_enc_input_buffer_used_cb(media_packet_h pkt, void *user_data)
+{
+ /* release input raw packet */
+ media_packet_destroy(pkt);
+}
+
+/* this callback is called when the input buffer for codec has done to use */
+void _mediacodec_dec_input_buffer_used_cb(media_packet_h pkt, void *user_data)
+{
+ /* release input encoded packet */
+ media_packet_destroy(pkt);
+}
+
+void _mediacodec_enc_output_buffer_available_cb(media_packet_h pkt, void *user_data)
+{
+ App *app = (App*)user_data;
+
+ mediacodec_h media_codec_handle = app->mc_handle[1];
+ media_packet_h output_buf = NULL;
+ mediacodec_get_output(media_codec_handle, &output_buf, 0);
+ /* decode encoded camera preview */
+ mediacodec_process_input(app->mc_handle[0], output_buf, 0);
+}
+
+void _mediacodec_dec_output_buffer_available_cb(media_packet_h pkt, void *user_data)
+{
+ App *app = (App*)user_data;
+
+ mediacodec_h media_codec_handle = app->mc_handle[0];
+ media_packet_h output_buf = NULL;
+
+ mediacodec_get_output(media_codec_handle, &output_buf, 0);
+
+ if (app->enable_dump)
+ decoder_output_dump(app, output_buf);
+
+ media_packet_destroy(output_buf);
+}
+
+void _media_packet_preview_cb(media_packet_h packet, void *user_data)
+{
+ App *app = user_data;
+ g_mutex_lock(&app->lock);
+ mediacodec_process_input(app->mc_handle[1], packet, 0);
+ g_mutex_unlock(&app->lock);
+
+ return;
+}
+
+void _mediacodec_camera_start(App *app)
+{
+ int default_format = CAMERA_PIXEL_FORMAT_NV12;
+ app->width = 640;
+ app->height = 480;
+ app->hardware = TRUE;
+
+ /*create decoder instance and setup */
+ mediacodec_create(&app->mc_handle[0]);
+ mediacodec_set_codec(app->mc_handle[0], MEDIACODEC_H264, MEDIACODEC_DECODER | MEDIACODEC_SUPPORT_TYPE_HW);
+ mediacodec_set_vdec_info(app->mc_handle[0], app->width, app->height);
+ /* set callback */
+ mediacodec_set_input_buffer_used_cb(app->mc_handle[0], _mediacodec_dec_input_buffer_used_cb, NULL);
+ mediacodec_set_output_buffer_available_cb(app->mc_handle[0], _mediacodec_dec_output_buffer_available_cb, app);
+ mediacodec_prepare(app->mc_handle[0]);
+
+ /*create encoder instance and setup */
+ mediacodec_create(&app->mc_handle[1]);
+ mediacodec_set_codec(app->mc_handle[1], MEDIACODEC_H264, MEDIACODEC_ENCODER | MEDIACODEC_SUPPORT_TYPE_HW);
+ mediacodec_set_venc_info(app->mc_handle[1], app->width, app->height, 30, 1000);
+ /* set callback */
+ mediacodec_set_input_buffer_used_cb(app->mc_handle[1], _mediacodec_enc_input_buffer_used_cb, NULL);
+ mediacodec_set_output_buffer_available_cb(app->mc_handle[1], _mediacodec_enc_output_buffer_available_cb, app);
+ mediacodec_prepare(app->mc_handle[1]);
+
+ /* create camera instance and setup and then start preview */
+ camera_create(CAMERA_DEVICE_CAMERA0, &app->camera_handle);
+ camera_set_media_packet_preview_cb(app->camera_handle, _media_packet_preview_cb, app);
+ camera_get_preview_format(app->camera_handle, &default_format);
+ camera_set_preview_format(app->camera_handle, default_format);
+ camera_set_preview_resolution(app->camera_handle, app->width, app->height);
+ camera_set_display(app->camera_handle, CAMERA_DISPLAY_TYPE_NONE, NULL);
+ camera_start_preview(app->camera_handle);
+
+ return;
+}
+
+
+void _mediacodec_camera_stop(App *app)
+{
+ camera_state_e camera_state = CAMERA_STATE_NONE;
+
+ camera_get_state(app->camera_handle, &camera_state);
+ camera_stop_preview(app->camera_handle);
+ camera_destroy(app->camera_handle);
+
+ mediacodec_unprepare(app->mc_handle[0]);
+ mediacodec_unprepare(app->mc_handle[1]);
+ mediacodec_destroy(app->mc_handle[0]);
+ mediacodec_destroy(app->mc_handle[1]);
+ return;
+}
+
+void _mediacodec_auto_test(App *app, char *path)
+{
+ gint ret = 0;
+ gint num_tracks = 0;
+ gint track = 0;
+ gint width = 0;
+ gint height = 0;
+ gint channel = 0;
+ gint samplerate = 0;
+ gint bit = 0;
+ media_format_type_e formattype;
+ media_format_mimetype_e video_mime;
+ media_format_mimetype_e audio_mime;
+ gint codec_mask = 0xFFF0;
+ gint codec_id;
+ app->demux_eos = 0;
+ app->codec_eos = 0;
+ app->etb = 0;
+ app->ebd = 0;
+ app->ftb = 0;
+ app->fbd = 0;
+
+ ret = mediademuxer_create(&app->demuxer);
+ if (ret != MEDIACODEC_ERROR_NONE) {
+ g_print("failed to create demuxer\n");
+ return;
+ }
+
+ ret = mediademuxer_set_data_source(app->demuxer, path);
+ if (ret != MEDIACODEC_ERROR_NONE) {
+ g_print("failed to mediademuxer_set_data_source\n");
+ return;
+ }
+
+ ret = mediademuxer_set_error_cb(app->demuxer, demuxer_error_cb, app->demuxer);
+ if (ret != MEDIACODEC_ERROR_NONE) {
+ g_print("failed to mediademuxer_set_error_cb\n");
+ return;
+ }
+
+ mediademuxer_set_eos_cb(app->demuxer, _mediademuxer_eos_cb, app);
+
+ ret = mediademuxer_prepare(app->demuxer);
+ if (ret != MEDIACODEC_ERROR_NONE) {
+ g_print("failed to prepare\n");
+ return;
+ }
+
+
+ ret = mediademuxer_get_track_count(app->demuxer, &num_tracks);
+ if (ret != MEDIACODEC_ERROR_NONE) {
+ g_print("failed to get track\n");
+ return;
+ }
+
+ for (track = 0; track < num_tracks; track++) {
+ ret = mediademuxer_get_track_info(app->demuxer, track, &app->format[track]);
+ if (ret != MEDIACODEC_ERROR_NONE) {
+ g_print("failed to get track info\n");
+ return;
+ }
+
+ media_format_get_type(app->format[track], &formattype);
+
+ if (!app->is_video && formattype == MEDIA_FORMAT_AUDIO) {
+ app->audio_track = track;
+ app->type = AUDIO_DEC;
+ media_format_get_audio_info(app->format[track], &audio_mime, &channel, &samplerate, &bit, NULL);
+
+ mediademuxer_select_track(app->demuxer, track);
+
+ ret = mediacodec_create(&app->mc_handle[track]);
+ if (ret != MEDIACODEC_ERROR_NONE) {
+ g_print("failed to create mediacocec\n");
+ return;
+ }
+
+ codec_id = audio_mime & codec_mask;
+ g_print("auido codec_id : %x\n", codec_id);
+
+ ret = mediacodec_set_codec(app->mc_handle[track], codec_id, MEDIACODEC_DECODER | MEDIACODEC_SUPPORT_TYPE_SW);
+ if (ret != MEDIACODEC_ERROR_NONE) {
+ g_print("failed to set codec\n");
+ return;
+ }
+
+ ret = mediacodec_set_adec_info(app->mc_handle[track], samplerate, channel, bit);
+ if (ret != MEDIACODEC_ERROR_NONE) {
+ g_print("failed to set adec info\n");
+ return;
+ }
+
+ mediacodec_set_buffer_status_cb(app->mc_handle[track], _av_buffer_status_cb, app);
+ mediacodec_set_input_buffer_used_cb(app->mc_handle[track], _mediacodec_inbuf_used_cb, app);
+ mediacodec_set_output_buffer_available_cb(app->mc_handle[track], _audio_outbuf_available_cb, app);
+ mediacodec_set_eos_cb(app->mc_handle[track], _mediacodec_eos_cb, app);
+ mediacodec_set_error_cb(app->mc_handle[track], _mediacodec_error_cb, NULL);
+
+ } else if (app->is_video && formattype == MEDIA_FORMAT_VIDEO) {
+ app->video_track = track;
+ app->type = VIDEO_DEC;
+ media_format_get_video_info(app->format[track], &video_mime, &width, &height, NULL, NULL);
+
+ mediademuxer_select_track(app->demuxer, track);
+
+ ret = mediacodec_create(&app->mc_handle[track]);
+ if (ret != MEDIACODEC_ERROR_NONE) {
+ g_print("failed to create mediacocec\n");
+ return;
+ }
+
+ app->width = width;
+ app->height = height;
+
+ codec_id = video_mime & codec_mask;
+ g_print("video codec_id : %x\n", codec_id);
+
+ ret = mediacodec_set_codec(app->mc_handle[track], codec_id, MEDIACODEC_DECODER | MEDIACODEC_SUPPORT_TYPE_HW);
+ if (ret != MEDIACODEC_ERROR_NONE) {
+ g_print("failed to set codec\n");
+ return;
+ }
+
+ ret = mediacodec_set_vdec_info(app->mc_handle[track], width, height);
+ if (ret != MEDIACODEC_ERROR_NONE) {
+ g_print("failed to set vdec info\n");
+ return;
+ }
+
+ mediacodec_set_buffer_status_cb(app->mc_handle[track], _av_buffer_status_cb, app);
+ mediacodec_set_input_buffer_used_cb(app->mc_handle[track], _mediacodec_inbuf_used_cb, app);
+ mediacodec_set_output_buffer_available_cb(app->mc_handle[track], _video_outbuf_available_cb, app);
+ mediacodec_set_eos_cb(app->mc_handle[track], _mediacodec_eos_cb, app);
+ mediacodec_set_error_cb(app->mc_handle[track], _mediacodec_error_cb, NULL);
+ }
+ }
+
+ ret = mediademuxer_start(app->demuxer);
+ if (ret != MEDIACODEC_ERROR_NONE) {
+ g_print("failed to start mediademuxer\n");
+ return;
+ }
+
+ track = app->is_video ? app->video_track : app->audio_track;
+ ret = mediacodec_prepare(app->mc_handle[track]);
+ if (ret != MEDIACODEC_ERROR_NONE) {
+ g_print("failed to prepare mediacodec\n");
+ return;
+ }
+
+ g_cond_init(&app->thread_cond);
+ g_cond_init(&app->eos_cond);
+ g_cond_init(&app->dst_eos_cond);
+ g_mutex_init(&app->thread_mutex);
+ g_mutex_init(&app->eos_mutex);
+
+ app->thread = g_thread_new("feed thread", &av_feed_thread, app);