#include <appcore-efl.h>
#include <gst/gst.h>
+#include <camera.h>
#include <media_codec.h>
#include <media_packet.h>
#include <media_packet_pool.h>
bool enable_dump;
int frame;
type_e type;
+ camera_h camera_handle;
/* video */
mediacodec_h mc_handle[MAX_HANDLE];
guint width;
break;
case MEDIACODEC_H263:
if (encoder) {
- extractor = h263_extractor;
+ extractor = yuv_extractor;
mime = *hardware ? MEDIA_FORMAT_NV12 : MEDIA_FORMAT_I420;
} else {
extractor = h263_extractor;
return;
}
+static 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 */
+static void _mediacodec_dec_input_buffer_used_cb(media_packet_h pkt, void *user_data)
+{
+ /* release input encoded packet */
+ media_packet_destroy(pkt);
+}
+
+static 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);
+}
+
+static 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);
+}
+
+static 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;
+}
+
+static 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;
+}
+
+
+static 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;
+}
+
static void _mediacodec_unprepare(App *app)
{
mediacodec_unprepare(app->mc_handle[0]);
_mediacodec_unprepare(app);
else if (strncmp(cmd, "dt", 2) == 0)
_mediacodec_destroy(app);
+ else if (strncmp(cmd, "cr", 2) == 0)
+ _mediacodec_camera_start(app);
+ else if (strncmp(cmd, "ct", 2) == 0)
+ _mediacodec_camera_stop(app);
else if (strncmp(cmd, "dp", 2) == 0) {
if (!app->enable_dump) {
app->enable_dump = TRUE;
g_print("rb. Reset output buffer \n");
g_print("un. Unprepare \t\t");
g_print("dt. Destroy \t\t");
- g_print("q. quite test suite \n");
+ g_print("q. quit test suite \n");
g_print("dp. enable dump \n");
+ g_print("-----------------------------------------------------------------------------------------\n");
+ g_print("cr. camera preview -> encoder -> decoder\n");
+ g_print("ct. quit camera test\n");
g_print("\n");
g_print("=========================================================================================\n");
}