#include <appcore-efl.h>
#include <gst/gst.h>
-#include <media_codec.h>
-#include <media_packet.h>
#include <tbm_surface.h>
#include <dlog.h>
#include <time.h>
+#include <camera.h>
+#include <media_codec.h>
+#include <media_packet.h>
+#include <media_packet_pool.h>
+#include <media_codec_internal.h>
#define PACKAGE "media_codec_test"
#define MAX_HANDLE 4
-//#define DUMP_OUTBUF 1
+#if 0
+#define DUMP_OUTBUF 1
+#endif
#define TEST_FILE_SIZE (10 * 1024 * 1024)
#define MAX_STRING_LEN 256
#define GET_IS_HW(x) CHECK_BIT(x, 2)
#define ES_DEFAULT_VIDEO_PTS_OFFSET 33000000
#define CHECK_VALID_PACKET(state, expected_state) \
- ((state & (expected_state)) == (expected_state))
+ ((state & (expected_state)) == (expected_state))
+
+#define AAC_CODECDATA_SIZE 16
+#define USE_POOL 1
-static int samplerate = DEFAULT_SAMPPLERATE;
-static int channel = DEFAULT_CHANNEL;
-static int bit = DEFAULT_BIT;
-static int bitrate = DEFAULT_BITRATE;
-static int samplebyte = DEFAULT_SAMPLEBYTE;
unsigned char buf_adts[ADTS_HEADER_SIZE];
-enum
-{
- MC_EXIST_SPS = 1 << 0,
- MC_EXIST_PPS = 1 << 1,
- MC_EXIST_IDR = 1 << 2,
- MC_EXIST_SLICE = 1 << 3,
+enum {
+ MC_EXIST_SPS = 1 << 0,
+ MC_EXIST_PPS = 1 << 1,
+ MC_EXIST_IDR = 1 << 2,
+ MC_EXIST_SLICE = 1 << 3,
- MC_VALID_HEADER = ( MC_EXIST_SPS | MC_EXIST_PPS ),
- MC_VALID_FIRST_SLICE = ( MC_EXIST_SPS | MC_EXIST_PPS | MC_EXIST_IDR )
+ MC_VALID_HEADER = (MC_EXIST_SPS | MC_EXIST_PPS),
+ MC_VALID_FIRST_SLICE = (MC_EXIST_SPS | MC_EXIST_PPS | MC_EXIST_IDR)
};
typedef struct _App App;
-enum
-{
- CURRENT_STATUS_MAINMENU,
- CURRENT_STATUS_FILENAME,
- CURRENT_STATUS_CREATE,
- CURRENT_STATUS_DESTROY,
- CURRENT_STATUS_SET_CODEC,
- CURRENT_STATUS_SET_VDEC_INFO,
- CURRENT_STATUS_SET_VENC_INFO,
- CURRENT_STATUS_SET_ADEC_INFO,
- CURRENT_STATUS_SET_AENC_INFO,
- CURRENT_STATUS_PREPARE,
- CURRENT_STATUS_UNPREPARE,
- CURRENT_STATUS_PROCESS_INPUT,
- CURRENT_STATUS_GET_OUTPUT,
- CURRENT_STATUS_RESET_OUTPUT_BUFFER,
- CURRENT_STATUS_SET_SIZE,
+enum {
+ CURRENT_STATUS_MAINMENU,
+ CURRENT_STATUS_FILENAME,
+ CURRENT_STATUS_CREATE,
+ CURRENT_STATUS_DESTROY,
+ CURRENT_STATUS_SET_CODEC,
+ CURRENT_STATUS_SET_VDEC_INFO,
+ CURRENT_STATUS_SET_VENC_INFO,
+ CURRENT_STATUS_SET_ADEC_INFO,
+ CURRENT_STATUS_SET_AENC_INFO,
+ CURRENT_STATUS_PREPARE,
+ CURRENT_STATUS_UNPREPARE,
+ CURRENT_STATUS_PROCESS_INPUT,
+ CURRENT_STATUS_GET_OUTPUT,
+ CURRENT_STATUS_RESET_OUTPUT_BUFFER,
+ CURRENT_STATUS_SET_SIZE,
};
-typedef enum
-{
- NAL_SLICE_NO_PARTITIONING = 1,
- NAL_SLICE_PART_A,
- NAL_SLICE_PART_B,
- NAL_SLICE_PART_C,
- NAL_SLICE_IDR,
- NAL_SEI,
- NAL_SEQUENCE_PARAMETER_SET,
- NAL_PICTURE_PARAMETER_SET,
- NAL_PICTURE_DELIMITER,
- NAL_END_OF_SEQUENCE,
- NAL_END_OF_STREAM,
- NAL_FILLER_DATA,
- NAL_PREFIX_SVC = 14
+typedef enum {
+ NAL_SLICE_NO_PARTITIONING = 1,
+ NAL_SLICE_PART_A,
+ NAL_SLICE_PART_B,
+ NAL_SLICE_PART_C,
+ NAL_SLICE_IDR,
+ NAL_SEI,
+ NAL_SEQUENCE_PARAMETER_SET,
+ NAL_PICTURE_PARAMETER_SET,
+ NAL_PICTURE_DELIMITER,
+ NAL_END_OF_SEQUENCE,
+ NAL_END_OF_STREAM,
+ NAL_FILLER_DATA,
+ NAL_PREFIX_SVC = 14
} nal_unit_type;
-typedef enum
-{
- VIDEO_DEC,
- VIDEO_ENC,
- AUDIO_DEC,
- AUDIO_ENC
-}type_e;
-
-
-struct _App
-{
- GMainLoop *loop;
- guint sourceid;
-
- GMappedFile *file;
- guint8 *data;
- gsize length;
- guint64 offset;
- guint obj;
-
- GTimer *timer;
- long start;
- long finish;
- long process_time;
- int frame_count;
-
- int codecid;
- int flag;
- bool is_video[MAX_HANDLE];
- bool is_encoder[MAX_HANDLE];
- bool hardware;
- type_e type;
- /* video */
- mediacodec_h mc_handle[MAX_HANDLE];
- guint width;
- guint height;
- guint fps;
- guint target_bits;
- media_format_mimetype_e mime;
-
- /* Audio */
- guint samplerate;
- guint channel;
- guint bit;
- guint bitrate;
- bool is_amr_nb;
-
-
- /* Render */
- guint w;
- guint h;
- Evas_Object *win;
- Evas_Object *img;
- media_packet_h packet;
- Ecore_Pipe *pipe;
- //camera_h camera_handle;
- GList *packet_list;
- GMutex lock;
+typedef enum {
+ VIDEO_DEC,
+ VIDEO_ENC,
+ AUDIO_DEC,
+ AUDIO_ENC
+} type_e;
+
+
+struct _App {
+ GMainLoop *loop;
+ guint sourceid;
+
+ GMappedFile *file;
+ guint8 *data;
+ gint length;
+ gint offset;
+ gint obj;
+
+ GTimer *timer;
+ long start;
+ long finish;
+ long process_time;
+ int frame_count;
+
+ int codecid;
+ int flag;
+ bool is_video;
+ bool is_encoder;
+ bool hardware;
+ bool enable_dump;
+ int frame;
+ type_e type;
+ camera_h camera_handle;
+ /* video */
+ mediacodec_h mc_handle[MAX_HANDLE];
+ guint width;
+ guint height;
+ guint fps;
+ guint target_bits;
+ media_format_mimetype_e mime;
+
+ /* Audio */
+ guint samplerate;
+ guint channel;
+ guint bit;
+ guint bitrate;
+ bool is_amr_nb;
+
+
+ /* Render */
+ guint w;
+ guint h;
+ Evas_Object *win;
+ Evas_Object *img;
+ media_packet_h packet;
+ Ecore_Pipe *pipe;
+ GList *packet_list;
+ GMutex lock;
};
App s_app;
-media_format_h aenc_fmt = NULL;
-media_format_h adec_fmt = NULL;
-media_format_h vdec_fmt = NULL;
-media_format_h venc_fmt = NULL;
-
-#if DUMP_OUTBUF
-FILE *fp_out = NULL;
-#endif
+media_format_h fmt = NULL;
+media_packet_pool_h pkt_pool = NULL;
/* Internal Functions */
static int _create_app(void *data);
static void displaymenu(void);
static void display_sub_basic();
+static void _mediacodec_unprepare(App *app);
/* For debugging */
static void mc_hex_dump(char *desc, void *addr, int len);
static void decoder_output_dump(App *app, media_packet_h pkt);
-
+static void output_dump(App *app, media_packet_h pkt);
/* */
+const char* codec_type_to_string(mediacodec_codec_type_e media_codec_id);
void (*extractor)(App *app, unsigned char** data, int *size, bool *have_frame);
static int _create_app(void *data)
{
- printf("My app is going alive!\n");
- App *app = (App*)data;
+ g_print("My app is going alive!\n");
+ App *app = (App*)data;
- g_mutex_init(&app->lock);
- return 0;
+ g_mutex_init(&app->lock);
+ return 0;
}
static int _terminate_app(void *data)
{
- printf("My app is going gone!\n");
- App *app = (App*)data;
+ g_print("My app is going gone!\n");
+ App *app = (App*)data;
- g_mutex_clear(&app->lock);
- return 0;
+ g_mutex_clear(&app->lock);
+ return 0;
}
struct appcore_ops ops = {
- .create = _create_app,
- .terminate = _terminate_app,
+ .create = _create_app,
+ .terminate = _terminate_app,
};
static const guint mp3types_bitrates[2][3][16] = {
-{
- {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448,},
- {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384,},
- {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320,}
- },
-{
- {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256,},
- {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,},
- {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}
- },
+ {
+ {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448,},
+ {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384,},
+ {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320,}
+ },
+ {
+ {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256,},
+ {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,},
+ {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}
+ },
};
static const guint mp3types_freqs[3][3] = { {44100, 48000, 32000},
- {22050, 24000, 16000},
- {11025, 12000, 8000}
+ {22050, 24000, 16000},
+ {11025, 12000, 8000}
};
void h264_extractor(App *app, unsigned char **data, int *size, bool *have_frame)
{
- int nal_length = 0;
- unsigned char val, zero_count;
- //unsigned char *pNal = data;
- unsigned char *pNal = app->data + app->offset;
- int max = app->length - app->offset;
- int i = 0;
- int index = 0;
- int nal_unit_type = 0;
- bool init;
- bool slice;
- bool idr;
- static int state;
- int read;
-
- zero_count = 0;
-
- val = pNal[index++];
- while (!val)
- {
- zero_count++;
- val = pNal[index++];
- }
-
- zero_count = 0;
-
- while (1)
- {
- if (index >= max) {
- read = (index - 1);
- goto DONE;
- }
-
- val = pNal[index++];
-
- if (!val)
- zero_count++;
- else {
- if ((zero_count >= 2) && (val == 1))
- break;
- else {
- zero_count = 0;
- }
- }
- }
-
- if( zero_count > 3 )
- zero_count = 3;
-
- read = ( index - zero_count - 1);
-
- nal_unit_type = *(app->data+app->offset+4) & 0x1F;
- g_print("nal_unit_type : %x\n", nal_unit_type);
-
- switch ( nal_unit_type )
- {
- case NAL_SEQUENCE_PARAMETER_SET:
- g_print("nal_unit_type : SPS\n");
- state |= MC_EXIST_SPS;
- break;
- case NAL_PICTURE_PARAMETER_SET:
- g_print("nal_unit_type : PPS\n");
- state |= MC_EXIST_PPS;
- break;
- case NAL_SLICE_IDR:
- case NAL_SEI:
- g_print ("nal_unit_type : IDR\n");
- state |= MC_EXIST_IDR;
- break;
- case NAL_SLICE_NO_PARTITIONING:
- case NAL_SLICE_PART_A:
- case NAL_SLICE_PART_B:
- case NAL_SLICE_PART_C:
- state |= MC_EXIST_SLICE;
- break;
- default:
- g_print ("nal_unit_type : %x", nal_unit_type);
- break;
- }
-
- init = CHECK_VALID_PACKET(state, MC_VALID_FIRST_SLICE) ? 1 :0;
- slice = CHECK_VALID_PACKET(state, MC_EXIST_SLICE) ? 1 :0;
- idr = CHECK_VALID_PACKET(state, MC_EXIST_IDR) ? 1 : 0;
- g_print("status : %d, slice : %d, idr : %d\n", init, slice, idr);
-
- if (init || idr || slice) {
- *have_frame = TRUE;
- if (init) {
- *data = app->data;
- *size = app->offset + read;
- } else {
- *data = app->data+app->offset;
- *size = read;
- }
- state = 0;
- } else {
- *data = app->data+app->offset;
- *size = read;
- //app->offset += read;
- }
+ unsigned char val, zero_count;
+ unsigned char *pNal = app->data + app->offset;
+ int max = app->length - app->offset;
+ int index = 0;
+ int nal_unit_type = 0;
+ bool init;
+ bool slice;
+ bool idr;
+ static int state;
+ int read;
+
+ zero_count = 0;
+
+ val = pNal[index++];
+ while (!val) {
+ zero_count++;
+ val = pNal[index++];
+ }
+
+ zero_count = 0;
+
+ while (1) {
+ if (index >= max) {
+ read = (index - 1);
+ goto DONE;
+ }
+
+ val = pNal[index++];
+
+ if (!val)
+ zero_count++;
+ else {
+ if ((zero_count >= 2) && (val == 1))
+ break;
+ else
+ zero_count = 0;
+ }
+ }
+
+ if (zero_count > 3)
+ zero_count = 3;
+
+ read = (index - zero_count - 1);
+
+ nal_unit_type = *(app->data+app->offset+4) & 0x1F;
+ g_print("nal_unit_type : %x\n", nal_unit_type);
+
+ switch (nal_unit_type) {
+ case NAL_SEQUENCE_PARAMETER_SET:
+ g_print("nal_unit_type : SPS\n");
+ state |= MC_EXIST_SPS;
+ break;
+ case NAL_PICTURE_PARAMETER_SET:
+ g_print("nal_unit_type : PPS\n");
+ state |= MC_EXIST_PPS;
+ break;
+ case NAL_SLICE_IDR:
+ case NAL_SEI:
+ g_print ("nal_unit_type : IDR\n");
+ state |= MC_EXIST_IDR;
+ break;
+ case NAL_SLICE_NO_PARTITIONING:
+ case NAL_SLICE_PART_A:
+ case NAL_SLICE_PART_B:
+ case NAL_SLICE_PART_C:
+ state |= MC_EXIST_SLICE;
+ break;
+ default:
+ g_print ("nal_unit_type : %x", nal_unit_type);
+ break;
+ }
+
+ init = CHECK_VALID_PACKET(state, MC_VALID_FIRST_SLICE) ? 1 : 0;
+ slice = CHECK_VALID_PACKET(state, MC_EXIST_SLICE) ? 1 : 0;
+ idr = CHECK_VALID_PACKET(state, MC_EXIST_IDR) ? 1 : 0;
+ g_print("status : %d, slice : %d, idr : %d\n", init, slice, idr);
+
+ if (init || idr || slice) {
+ *have_frame = TRUE;
+ if (init) {
+ *data = app->data;
+ *size = app->offset + read;
+ } else {
+ *data = app->data+app->offset;
+ *size = read;
+ }
+ state = 0;
+ } else {
+ *data = app->data+app->offset;
+ *size = read;
+ }
DONE:
- app->offset += read;
+ app->offset += read;
+}
+
+void h263_extractor(App * app, unsigned char **data, int *size, bool * have_frame)
+{
+ int len = 0;
+ int read_size = 1, state = 1, bStart = 0;
+ unsigned char val;
+ unsigned char *pH263 = app->data + app->offset;
+ *data = pH263;
+ int max = app->length - app->offset;
+
+ while (1) {
+ if (len >= max) {
+ read_size = (len - 1);
+ goto DONE;
+ }
+ val = pH263[len++];
+ switch (state) {
+ case 1:
+ if (val == 0x00)
+ state++;
+ break;
+ case 2:
+ if (val == 0x00)
+ state++;
+ else
+ state = 1;
+ break;
+ case 3:
+ state = 1;
+ if ((val & 0xFC) == 0x80) {
+ if (bStart) {
+ read_size = len - 3;
+ goto DONE;
+ } else {
+ bStart = 1;
+ }
+ }
+ break;
+ }
+ }
+ DONE:
+ *size = read_size;
+ app->offset += read_size;
+ *have_frame = TRUE;
+}
+
+void mpeg4_extractor(App * app, unsigned char **data, int *size, bool * have_frame)
+{
+ int len = 0;
+ int result = 0;
+ int state = 1, bType = 0;
+ unsigned char val;
+ unsigned char *pMpeg4 = app->data + app->offset;
+ *data = pMpeg4;
+ int max = app->length - app->offset;
+
+ while (1) {
+ if (len >= max) {
+ result = (len - 1);
+ goto DONE;
+ }
+
+ val = pMpeg4[len++];
+
+ switch (state) {
+ case 1:
+ if (val == 0x00)
+ state++;
+ break;
+ case 2:
+ if (val == 0x00)
+ state++;
+ else
+ state = 1;
+ break;
+ case 3:
+ if (val == 0x01)
+ state++;
+ else
+ state = 1;
+ break;
+ case 4:
+ state = 1;
+ if (val == 0xB0 || val == 0xB6) {
+ if (bType == 0xB6) {
+ result = len - 4;
+ goto DONE;
+ }
+ if (!bType) {
+ if (val == 0xB0)
+ *have_frame = TRUE;
+ }
+ bType = val;
+ }
+ break;
+ }
+ }
+ DONE:
+ *size = result;
+ app->offset += result;
+ *have_frame = TRUE;
+}
+
+/**
+ * Extract Input data for AMR-NB/WB decoder
+ * - AMR-NB : mime type ("audio/AMR") / 8Khz / 1 ch / 16 bits
+ * - AMR-WB : mime type ("audio/AMR-WB") / 16Khz / 1 ch / 16 bits
+ **/
+int write_amr_header = 1; /* write magic number for AMR Header at one time */
+static const char AMR_header[] = "#!AMR\n";
+static const char AMRWB_header[] = "#!AMR-WB\n";
+#define AMR_NB_MIME_HDR_SIZE 6
+#define AMR_WB_MIME_HDR_SIZE 9
+static const int block_size_nb[16] = { 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 };
+static const int block_size_wb[16] = { 17, 23, 32, 36, 40, 46, 50, 58, 60, 5, -1, -1, -1, -1, 0, 0 };
+
+int *blocksize_tbl;
+void amrdec_extractor(App * app, unsigned char **data, int *size, bool * have_frame)
+{
+ int readsize = 0, mode_temp;
+ unsigned int fsize, mode;
+ unsigned char *pAmr = app->data + app->offset;
+ /* change the below one to frame count */
+ if (app->offset == 0) {
+ if (!memcmp(pAmr, AMR_header, AMR_NB_MIME_HDR_SIZE)) {
+ blocksize_tbl = (int *)block_size_nb;
+ mode_temp = pAmr[AMR_NB_MIME_HDR_SIZE];
+ pAmr = pAmr + AMR_NB_MIME_HDR_SIZE;
+ app->offset += AMR_NB_MIME_HDR_SIZE;
+ } else {
+ if (!memcmp(pAmr, AMRWB_header, AMR_WB_MIME_HDR_SIZE)) {
+ blocksize_tbl = (int *)block_size_wb;
+ mode_temp = pAmr[AMR_WB_MIME_HDR_SIZE];
+ pAmr = pAmr + AMR_WB_MIME_HDR_SIZE;
+ app->offset += AMR_WB_MIME_HDR_SIZE;
+ } else {
+ g_print("[ERROR] AMR-NB/WB don't detected..\n");
+ return;
+ }
+ }
+ }
+ mode_temp = pAmr[0];
+ if ((mode_temp & 0x83) == 0) {
+ mode = (mode_temp >> 3) & 0x0F; /* Yep. Retrieve the frame size */
+ fsize = blocksize_tbl[mode];
+ readsize = fsize + 1;
+ } else {
+ readsize = 0;
+ g_print("[FAIL] Not found amr frame sync.....\n");
+ }
+
+ *size = readsize;
+ app->offset += readsize;
+ *data = pAmr;
+ *have_frame = TRUE;
}
void nv12_extractor(App *app, unsigned char **data, int *size, bool *have_frame)
{
- int yuv_size;
- int offset = app->length - app->offset;
+ int yuv_size;
+ int offset = app->length - app->offset;
- yuv_size = app->width * app->height * 3 / 2;
+ yuv_size = app->width * app->height * 3 / 2;
- if (offset >= yuv_size)
- *size = offset;
+ if (offset >= yuv_size)
+ *size = offset;
- *have_frame = TRUE;
- *data = app->data + app->offset;
+ *have_frame = TRUE;
+ *data = app->data + app->offset;
- if (offset >= yuv_size)
- *size = offset;
- else
- *size = yuv_size;
+ if (offset >= yuv_size)
+ *size = offset;
+ else
+ *size = yuv_size;
}
void yuv_extractor(App *app, unsigned char **data, int *size, bool *have_frame)
{
- int yuv_size;
- int offset = app->length - app->offset;
+ int yuv_size;
+ int offset = app->length - app->offset;
- yuv_size = app->width * app->height * 3 / 2;
+ yuv_size = app->width * app->height * 3 / 2;
- if (yuv_size >= offset)
- *size = offset;
+ if (yuv_size >= offset)
+ *size = offset;
- *have_frame = TRUE;
- *data = app->data + app->offset;
+ *have_frame = TRUE;
+ *data = app->data + app->offset;
- if (yuv_size >= offset)
- *size = offset;
- else
- *size = yuv_size;
+ if (yuv_size >= offset)
+ *size = offset;
+ else
+ *size = yuv_size;
- app->offset += *size;
+ app->offset += *size;
}
void aacenc_extractor(App *app, unsigned char **data, int *size, bool *have_frame)
{
- int read_size;
- int offset = app->length - app->offset;
+ int read_size;
+ int offset = app->length - app->offset;
- read_size = ((samplebyte*app->channel)*(app->bit/8));
+ read_size = ((DEFAULT_SAMPLEBYTE * app->channel)*(app->bit/8) * 2);
+ *have_frame = TRUE;
+ *data = app->data + app->offset;
- *have_frame = TRUE;
+ if (read_size >= offset)
+ *size = offset;
+ else
+ *size = read_size;
- if (offset >= read_size)
- *size = offset;
- else
- *size = read_size;
-
- app->offset += *size;
+ app->offset += *size;
}
void amrenc_extractor(App *app, unsigned char **data, int *size, bool *have_frame)
{
- int read_size;
- int offset = app->length - app->offset;
+ int read_size;
+ int offset = app->length - app->offset;
- if(app->is_amr_nb)
- read_size = AMRNB_PCM_INPUT_SIZE;
- else
- read_size = AMRWB_PCM_INPUT_SIZE;
+ if (app->is_amr_nb)
+ read_size = AMRNB_PCM_INPUT_SIZE;
+ else
+ read_size = AMRWB_PCM_INPUT_SIZE;
- *have_frame = TRUE;
+ *have_frame = TRUE;
+ *data = app->data + app->offset;
- if (offset >= read_size)
- *size = offset;
- else
- *size = read_size;
+ if (read_size >= offset)
+ *size = offset;
+ else
+ *size = read_size;
- app->offset += *size;
+ app->offset += *size;
}
/**
- * Extract Input data for AAC decoder
- * (case of (LC profile) ADTS format)
- * codec_data : Don't need
- **/
+ * Extract Input data for AAC decoder
+ * (case of (LC profile) ADTS format)
+ * codec_data : Don't need
+ **/
void aacdec_extractor(App *app, unsigned char **data, int *size, bool *have_frame)
{
- int read_size;
- int offset = app->length - app->offset;
- unsigned char *pData = app->data + app->offset;
+ int read_size;
+ int offset = app->length - app->offset;
+ unsigned char *pData = app->data + app->offset;
- if ((pData != NULL) && (pData[0] == 0xff) && ((pData[1] & 0xf6) == 0xf0)) {
- read_size = ((pData[3] & 0x03) << 11) | (pData[4] << 3) | ((pData[5] & 0xe0) >> 5);
- } else {
- read_size = 0;
- g_print("[FAIL] Not found aac frame sync.....\n");
- }
+ if ((pData != NULL) && (pData[0] == 0xff) && ((pData[1] & 0xf6) == 0xf0)) {
+ read_size = ((pData[3] & 0x03) << 11) | (pData[4] << 3) | ((pData[5] & 0xe0) >> 5);
+ } else {
+ read_size = 0;
+ g_print("[FAIL] Not found aac frame sync.....\n");
+ }
- *have_frame = TRUE;
- *data = app->data + app->offset;
+ *have_frame = TRUE;
+ *data = app->data + app->offset;
- if (read_size >= offset)
- *size = offset;
- else
- *size = read_size;
+ if (read_size >= offset)
+ *size = offset;
+ else
+ *size = read_size;
- app->offset += *size;
+ app->offset += *size;
}
void mp3dec_extractor(App *app, unsigned char **data, int *size, bool *have_frame)
{
- int read_size;
- guint header;
- guint padding, bitrate, lsf, layer, mpg25;
- guint hdr_bitrate, sf;
- int offset = app->length - app->offset;
- unsigned char *pData = app->data + app->offset;
-
- header = GST_READ_UINT32_BE(pData);
-
-
- if (header == 0) {
- g_print ("[ERROR] read header size is 0\n");
- *have_frame = FALSE;
- }
-
- /* if it's not a valid sync */
- if ((header & 0xffe00000) != 0xffe00000) {
- g_print ("[ERROR] invalid sync\n");
- *have_frame = FALSE;
- }
-
- if (((header >> 19) & 3) == 0x1) {
- g_print ("[ERROR] invalid MPEG version: %d\n", (header >> 19) & 3);
- *have_frame = FALSE;
- } else {
- if (header & (1 << 20)) {
- lsf = (header & (1 << 19)) ? 0 : 1;
- mpg25 = 0;
- } else {
- lsf = 1;
- mpg25 = 1;
- }
- }
-
- /* if it's an invalid layer */
- if (!((header >> 17) & 3)) {
- g_print("[ERROR] invalid layer: %d\n", (header >> 17) & 3);
- *have_frame = FALSE;
- } else {
- layer = 4 - ((header >> 17) & 0x3);
- }
-
- /* if it's an invalid bitrate */
- if (((header >> 12) & 0xf) == 0xf) {
- g_print ("[ERROR] invalid bitrate: %d\n", (header >> 12) & 0xf);
- *have_frame = FALSE;
- } else {
- bitrate = (header >> 12) & 0xF;
- hdr_bitrate = mp3types_bitrates[lsf][layer - 1][bitrate] * 1000;
- /* The caller has ensured we have a valid header, so bitrate can't be zero here. */
- if(hdr_bitrate == 0)
- *have_frame = FALSE;
- }
-
- /* if it's an invalid samplerate */
- if (((header >> 10) & 0x3) == 0x3) {
- g_print ("[ERROR] invalid samplerate: %d\n", (header >> 10) & 0x3);
- *have_frame = FALSE;
- } else {
- sf = (header >> 10) & 0x3;
- sf = mp3types_freqs[lsf + mpg25][sf];
- }
-
- padding = (header >> 9) & 0x1;
-
- switch (layer) {
- case 1:
- read_size = 4 * ((hdr_bitrate * 12) / sf + padding);
- break;
- case 2:
- read_size = (hdr_bitrate * 144) / sf + padding;
- break;
- default:
- case 3:
- read_size = (hdr_bitrate * 144) / (sf << lsf) + padding;
- break;
- }
- g_print("header : %d, read : %d\n", header, read_size);
-
- *have_frame = TRUE;
- *data = app->data + app->offset;
-
- if (read_size >= offset)
- *size = offset;
- else
- *size = read_size;
-
- app->offset += *size;
+ int read_size;
+ guint header;
+ guint padding, bitrate, lsf = 0, layer = 0, mpg25 = 0;
+ guint hdr_bitrate = 0, sf = 0;
+ int offset = app->length - app->offset;
+ unsigned char *pData = app->data + app->offset;
+
+ header = GST_READ_UINT32_BE(pData);
+
+ if (header == 0) {
+ g_print ("[ERROR] read header size is 0\n");
+ *have_frame = FALSE;
+ return;
+ }
+
+ /* if it's not a valid sync */
+ if ((header & 0xffe00000) != 0xffe00000) {
+ g_print ("[ERROR] invalid sync\n");
+ *have_frame = FALSE;
+ return;
+ }
+
+ if (((header >> 19) & 3) == 0x1) {
+ g_print ("[ERROR] invalid MPEG version: %d\n", (header >> 19) & 3);
+ *have_frame = FALSE;
+ return;
+ } else {
+ if (header & (1 << 20)) {
+ lsf = (header & (1 << 19)) ? 0 : 1;
+ mpg25 = 0;
+ } else {
+ lsf = 1;
+ mpg25 = 1;
+ }
+ }
+
+ /* if it's an invalid layer */
+ if (!((header >> 17) & 3)) {
+ g_print("[ERROR] invalid layer: %d\n", (header >> 17) & 3);
+ *have_frame = FALSE;
+ return;
+ } else {
+ layer = 4 - ((header >> 17) & 0x3);
+ }
+
+ /* if it's an invalid bitrate */
+ if (((header >> 12) & 0xf) == 0xf) {
+ g_print ("[ERROR] invalid bitrate: %d\n", (header >> 12) & 0xf);
+ *have_frame = FALSE;
+ return;
+ } else {
+ bitrate = (header >> 12) & 0xF;
+ hdr_bitrate = mp3types_bitrates[lsf][layer - 1][bitrate] * 1000;
+ /* The caller has ensured we have a valid header, so bitrate can't be zero here. */
+ if (hdr_bitrate == 0) {
+ *have_frame = FALSE;
+ return;
+ }
+ }
+
+ /* if it's an invalid samplerate */
+ if (((header >> 10) & 0x3) == 0x3) {
+ g_print ("[ERROR] invalid samplerate: %d\n", (header >> 10) & 0x3);
+ *have_frame = FALSE;
+ return;
+ } else {
+ sf = (header >> 10) & 0x3;
+ sf = mp3types_freqs[lsf + mpg25][sf];
+ }
+
+ padding = (header >> 9) & 0x1;
+
+ switch (layer) {
+ case 1:
+ read_size = 4 * ((hdr_bitrate * 12) / sf + padding);
+ break;
+ case 2:
+ read_size = (hdr_bitrate * 144) / sf + padding;
+ break;
+ default:
+ case 3:
+ read_size = (hdr_bitrate * 144) / (sf << lsf) + padding;
+ break;
+ }
+ g_print("header : %d, read : %d\n", header, read_size);
+
+ *have_frame = TRUE;
+ *data = app->data + app->offset;
+
+ if (read_size >= offset)
+ *size = offset;
+ else
+ *size = read_size;
+
+ app->offset += *size;
}
-#if 0
-void extract_input_aacdec_m4a_test(App *app, unsigned char* data, int *size, bool *have_frame)
+
+#if 1
+void extract_input_aacdec_m4a_test(App * app, unsigned char **data, int *size, bool * have_frame)
{
- int readsize = 0;
- size_t result;
- unsigned int header_size = ADTS_HEADER_SIZE;
- unsigned char buffer[1000000];
- unsigned char codecdata[AAC_CODECDATA_SIZE] = {0,};
-
- /*
- * It is not support full parsing MP4 container box.
- * So It MUST start as RAW valid frame sequence.
- * Testsuit that are not guaranteed to be available on functionality of all General DEMUXER/PARSER.
- */
-
- if (feof(fd))
- return 0;
-
- if (frame_count == 0)
- {
- /*
- * CAUTION : Codec data is needed only once in first time
- * Codec data is made(or extracted) by MP4 demuxer in 'esds' box.
- * So I use this data (byte) as hard coding for temporary our testing.
- */
+ int readsize = 0, read_size = 0;
+ unsigned int header_size = ADTS_HEADER_SIZE;
+ unsigned char buffer[100000];
+ unsigned char codecdata[AAC_CODECDATA_SIZE] = { 0, };
+ int offset = app->length - app->offset;
+ unsigned char *pData = app->data + app->offset;
+ /*
+ * It is not support full parsing MP4 container box.
+ * So It MUST start as RAW valid frame sequence.
+ * Testsuit that are not guaranteed to be available on functionality of all General DEMUXER/PARSER.
+ */
+
+ /* change the below one later */
+ if (app->offset == 0) {
+ /*
+ * CAUTION : Codec data is needed only once in first time
+ * Codec data is made(or extracted) by MP4 demuxer in 'esds' box.
+ * So I use this data (byte) as hard coding for temporary our testing.
+ */
#if 1
- /*
- * The codec_data data is according to AudioSpecificConfig,
- * ISO/IEC 14496-3, 1.6.2.1
- *
- * below example is test for using "test.aac" or "TestSample-AAC-LC.m4a"
- * case : M4A - LC profile
- * codec_data=(buffer)119056e5000000000000000000000000
- * savs aac decoder get codec_data. size: 16 (Tag size : 5 byte)
- * - codec data: profile : 2
- * - codec data: samplrate: 48000
- * - codec data: channels : 2
- */
- /* 2 bytes are mandatory */
- codecdata[0] = 0x11; //ex) (5bit) 2 (LC) / (4bit) 3 (48khz)
- codecdata[1] = 0x90; //ex) (4bit) 2 (2ch)
- /* othter bytes are (optional) epconfig information */
- codecdata[2] = 0x56;
- codecdata[3] = 0xE5;
- codecdata[4] = 0x00;
+ /*
+ * The codec_data data is according to AudioSpecificConfig,
+ * ISO/IEC 14496-3, 1.6.2.1
+ *
+ * below example is test for using "test.aac" or "TestSample-AAC-LC.m4a"
+ * case : M4A - LC profile
+ * codec_data=(buffer)119056e5000000000000000000000000
+ * savs aac decoder get codec_data. size: 16 (Tag size : 5 byte)
+ * - codec data: profile : 2
+ * - codec data: samplrate: 48000
+ * - codec data: channels : 2
+ */
+ /* 2 bytes are mandatory */
+ codecdata[0] = 0x11; /* ex) (5bit) 2 (LC) / (4bit) 3 (48khz)*/
+ codecdata[1] = 0x90; /* ex) (4bit) 2 (2ch) */
+ /* othter bytes are (optional) epconfig information */
+ codecdata[2] = 0x56;
+ codecdata[3] = 0xE5;
+ codecdata[4] = 0x00;
#else
- /*
- * below example is test for using "TestSample-EAAC+.m4a"
- *
- * case : M4A - HE-AAC v1 and v2 profile
- * codec_data=(buffer)138856e5a54880000000000000000000
- * savs aac decoder get codec_data. size: 16 (Tag size : 7 byte)
- * - codec data: profile : 2
- * - codec data: samplrate: 22050
- * - codec data: channels : 1
- */
- /* 2 bytes are mandatory */
- codecdata[0] = 0x13; //ex) (5bit) 2 (LC) / (4bit) 9 (22khz)
- codecdata[1] = 0x88; //ex) (4bit) 1 (1ch)
- /* othter bytes are (optional) epconfig information */
- codecdata[2] = 0x56;
- codecdata[3] = 0xE5;
- codecdata[4] = 0xA5;
- codecdata[5] = 0x48;
- codecdata[6] = 0x80;
+ /*
+ * below example is test for using "TestSample-EAAC+.m4a"
+ *
+ * case : M4A - HE-AAC v1 and v2 profile
+ * codec_data=(buffer)138856e5a54880000000000000000000
+ * savs aac decoder get codec_data. size: 16 (Tag size : 7 byte)
+ * - codec data: profile : 2
+ * - codec data: samplrate: 22050
+ * - codec data: channels : 1
+ */
+ /* 2 bytes are mandatory */
+ codecdata[0] = 0x13; /* ex) (5bit) 2 (LC) / (4bit) 9 (22khz) */
+ codecdata[1] = 0x88; /* ex) (4bit) 1 (1ch) */
+ /* othter bytes are (optional) epconfig information */
+ codecdata[2] = 0x56;
+ codecdata[3] = 0xE5;
+ codecdata[4] = 0xA5;
+ codecdata[5] = 0x48;
+ codecdata[6] = 0x80;
#endif
- memcpy(aacdata, codecdata, AAC_CODECDATA_SIZE);
-
- result = fread(buffer, 1, header_size, fd); //adts header
- if(result != header_size)
- {
- return -1;
- }
-
- if ((buffer != NULL) && (buffer[0] == 0xff) && ((buffer[1] & 0xf6) == 0xf0)) {
- readsize = ((buffer[3] & 0x03) << 11) | (buffer[4] << 3) | ((buffer[5] & 0xe0) >> 5);
- readsize = readsize -header_size;
- result = fread(buffer, 1, readsize, fd); //Make only RAW data, so exclude header 7 bytes
- memcpy(aacdata+AAC_CODECDATA_SIZE, buffer, readsize);
- }
-
- g_print( "[example] Insert 'codec_data' in 1st frame buffer size (%d)\n", readsize+AAC_CODECDATA_SIZE);
- return (readsize + AAC_CODECDATA_SIZE); //return combination of (codec_data + raw_data)
- }
-
- result = fread(buffer, 1, header_size, fd); //adts header
- if(result != header_size)
- {
- exit(1);
- }
-
- if ((buffer != NULL) && (buffer[0] == 0xff) && ((buffer[1] & 0xf6) == 0xf0)) {
- readsize = ((buffer[3] & 0x03) << 11) | (buffer[4] << 3) | ((buffer[5] & 0xe0) >> 5);
- readsize = readsize -header_size;
- result = fread(buffer, 1, readsize, fd); //Make only RAW data, so exclude header 7 bytes
- memcpy(aacdata, buffer, readsize);
- } else {
- readsize = 0;
- g_print("[FAIL] Not found aac frame sync.....\n");
- }
-
- return readsize; //return only raw_data
+ memcpy(buffer, codecdata, AAC_CODECDATA_SIZE);
+ if ((pData != NULL) && (pData[0] == 0xff) && ((pData[1] & 0xf6) == 0xf0)) {
+ read_size = ((pData[3] & 0x03) << 11) | (pData[4] << 3) | ((pData[5] & 0xe0) >> 5);
+ } else {
+ read_size = 0;
+ g_print("[FAIL] Not found aac frame sync.....\n");
+ }
+ readsize = read_size - header_size;
+ memcpy(buffer + AAC_CODECDATA_SIZE, pData + 7, readsize);
+ read_size = readsize + AAC_CODECDATA_SIZE; /* return combination of (codec_data + raw_data) */
+ app->offset += header_size + readsize;
+ goto DONE;
+ }
+
+ if ((pData != NULL) && (pData[0] == 0xff) && ((pData[1] & 0xf6) == 0xf0)) {
+ read_size = ((pData[3] & 0x03) << 11) | (pData[4] << 3) | ((pData[5] & 0xe0) >> 5);
+ readsize = read_size - header_size;
+ memcpy(buffer, pData + 7, readsize); /* Make only RAW data, so exclude header 7 bytes */
+ read_size = readsize;
+ app->offset += header_size + readsize;
+
+ if (app->offset > app->length) {
+ read_size = 0;
+ *have_frame = FALSE;
+ g_print("[FAIL] offset error \n");
+ return;
+ }
+
+ } else {
+ read_size = 0;
+ g_print("[FAIL] Not found aac frame sync. \n");
+ }
+ DONE:
+ *data = buffer;
+ *have_frame = TRUE;
+ if (read_size >= offset)
+ *size = offset;
+ else
+ *size = read_size;
}
#endif
/**
- * Extract Input data for AAC encoder
- **/
+ * Extract Input data for AAC encoder
+ **/
/*
-void aacenc_extractor(App *app, unsigned char **data, int *size, bool *have_frame)
-{
- int read_size;
- int offset = app->length - app->offset;
+ void aacenc_extractor(App *app, unsigned char **data, int *size, bool *have_frame)
+ {
+ int read_size;
+ int offset = app->length - app->offset;
- read_size = ((DEFAULT_SAMPLEBYTE*DEFAULT_CHANNEL)*(DEFAULT_BIT/8));
+ read_size = ((DEFAULT_SAMPLEBYTE*DEFAULT_CHANNEL)*(DEFAULT_BIT/8));
- if (read_size >= offset)
- *size = offset;
+ if (read_size >= offset)
+ *size = offset;
- *have_frame = TRUE;
- *data = app->data + app->offset;
+ *have_frame = TRUE;
+ *data = app->data + app->offset;
- if (read_size >= offset)
- *size = offset;
- else
- *size = read_size;
+ if (read_size >= offset)
+ *size = offset;
+ else
+ *size = read_size;
- app->offset += *size;
-}
-*/
+ app->offset += *size;
+ }
+ */
+#if 0
static void _mediacodec_empty_buffer_cb(media_packet_h pkt, void *user_data)
{
- if (pkt != NULL)
- {
- g_print("Used input buffer = %p\n", pkt);
- media_packet_destroy(pkt);
- }
- return;
+ if (pkt != NULL) {
+ g_print("Used input buffer = %p\n", pkt);
+ media_packet_destroy(pkt);
+ }
+ return;
+}
+#endif
+int _mediacodec_set_codec(App *app, int codecid, int flag, bool *hardware)
+{
+ bool encoder;
+ media_format_mimetype_e mime = 0;
+ encoder = GET_IS_ENCODER(flag) ? 1 : 0;
+ *hardware = GET_IS_HW(flag) ? 1 : 0;
+ app->is_encoder = encoder;
+
+ switch (codecid) {
+ case MEDIACODEC_H264:
+ if (encoder) {
+ extractor = yuv_extractor;
+ mime = *hardware ? MEDIA_FORMAT_NV12 : MEDIA_FORMAT_I420;
+ } else {
+ extractor = h264_extractor;
+ mime = MEDIA_FORMAT_H264_SP;
+ }
+ break;
+ case MEDIACODEC_MPEG4:
+ if (encoder) {
+ extractor = yuv_extractor;
+ mime = *hardware ? MEDIA_FORMAT_NV12 : MEDIA_FORMAT_I420;
+ } else {
+ extractor = mpeg4_extractor;
+ mime = MEDIA_FORMAT_MPEG4_SP;
+ }
+ break;
+ case MEDIACODEC_H263:
+ if (encoder) {
+ extractor = yuv_extractor;
+ mime = *hardware ? MEDIA_FORMAT_NV12 : MEDIA_FORMAT_I420;
+ } else {
+ extractor = h263_extractor;
+ mime = MEDIA_FORMAT_H263P;
+ }
+ break;
+ case MEDIACODEC_AAC:
+ if (encoder) {
+ extractor = aacenc_extractor;
+ mime = MEDIA_FORMAT_PCM_F32LE; /* FIXME need to check according to verdor */
+ } else {
+ extractor = aacdec_extractor;
+ mime = MEDIA_FORMAT_AAC;
+ }
+ break;
+ case MEDIACODEC_AAC_HE:
+ if (encoder) {
+ extractor = aacenc_extractor;
+ mime = MEDIA_FORMAT_PCM_F32LE; /* FIXME need to check according to verdor */
+ } else {
+ extractor = extract_input_aacdec_m4a_test;
+ mime = MEDIA_FORMAT_AAC_HE;
+ }
+ break;
+ case MEDIACODEC_AAC_HE_PS:
+ break;
+ case MEDIACODEC_MP3:
+ extractor = mp3dec_extractor;
+ mime = MEDIA_FORMAT_MP3;
+ break;
+ case MEDIACODEC_VORBIS:
+ break;
+ case MEDIACODEC_FLAC:
+ break;
+ case MEDIACODEC_WMAV1:
+ break;
+ case MEDIACODEC_WMAV2:
+ break;
+ case MEDIACODEC_WMAPRO:
+ break;
+ case MEDIACODEC_WMALSL:
+ break;
+ case MEDIACODEC_AMR_NB:
+ if (encoder) {
+ extractor = amrenc_extractor;
+ mime = MEDIA_FORMAT_PCM_F32LE; /* FIXME need to check according to verdor */
+ app->is_amr_nb = TRUE;
+ } else {
+ extractor = amrdec_extractor;
+ mime = MEDIA_FORMAT_AMR_NB;
+ }
+ break;
+ case MEDIACODEC_AMR_WB:
+ if (encoder) {
+ extractor = amrenc_extractor;
+ mime = MEDIA_FORMAT_PCM_F32LE; /* FIXME need to check according to verdor */
+ app->is_amr_nb = FALSE;
+ } else {
+ extractor = amrdec_extractor;
+ mime = MEDIA_FORMAT_AMR_WB;
+ }
+ break;
+ default:
+ LOGE("NOT SUPPORTED!!!!");
+ break;
+ }
+ return mime;
}
-int _mediacodec_set_codec(int codecid, int flag, int *hardware)
+static void _mediacodec_process_input(App *app)
{
- bool encoder;
- //bool hardware;
- media_format_mimetype_e mime;
- encoder = GET_IS_ENCODER(flag) ? 1 : 0;
- *hardware = GET_IS_HW(flag) ? 1 : 0;
-
- switch (codecid) {
- case MEDIACODEC_H264:
- if (encoder) {
- extractor = yuv_extractor;
- mime = *hardware ? MEDIA_FORMAT_NV12 : MEDIA_FORMAT_I420;
- } else {
- extractor = h264_extractor;
- mime = MEDIA_FORMAT_H264_SP;
- }
- break;
- case MEDIACODEC_MPEG4:
- if (encoder) {
- extractor = yuv_extractor;
- mime = *hardware ? MEDIA_FORMAT_NV12 : MEDIA_FORMAT_I420;
- } else {
- extractor = h264_extractor;
- mime = MEDIA_FORMAT_MPEG4_SP;
- }
- break;
- case MEDIACODEC_H263:
- if (encoder) {
- extractor = yuv_extractor;
- mime = *hardware ? MEDIA_FORMAT_NV12 : MEDIA_FORMAT_I420;
- } else {
- extractor = h264_extractor;
- mime = MEDIA_FORMAT_H263P;
- }
- break;
- case MEDIACODEC_AAC:
- if (encoder) {
- extractor = aacenc_extractor;
- mime = MEDIA_FORMAT_PCM;
- } else {
- extractor = aacdec_extractor;
- mime = MEDIA_FORMAT_AAC;
- }
- break;
- case MEDIACODEC_AAC_HE:
- if (encoder) {
- extractor = aacenc_extractor;
- mime = MEDIA_FORMAT_PCM;
- } else {
- //extractor = aacdec_extractor;
- mime = MEDIA_FORMAT_AAC_HE;
- }
- break;
- case MEDIACODEC_AAC_HE_PS:
- break;
- case MEDIACODEC_MP3:
- extractor = mp3dec_extractor;
- mime = MEDIA_FORMAT_MP3;
- break;
- case MEDIACODEC_VORBIS:
- break;
- case MEDIACODEC_FLAC:
- break;
- case MEDIACODEC_WMAV1:
- break;
- case MEDIACODEC_WMAV2:
- break;
- case MEDIACODEC_WMAPRO:
- break;
- case MEDIACODEC_WMALSL:
- break;
- default:
- LOGE("NOT SUPPORTED!!!!");
- break;
- }
- //media_format_set_video_mime(vdec_fmt, mime);
- return mime;
+ int i;
+ bool have_frame = FALSE;
+ int ret;
+ static guint64 pts = 0L;
+ void *buf_data_ptr = NULL;
+ media_packet_h pkt = NULL;
+ unsigned char *tmp;
+ int read;
+ int size;
+ int offset;
+ int stride_width;
+
+ for (i = 0; i < app->frame; i++) {
+ g_print("----------read data------------\n");
+
+ extractor(app, &tmp, &read, &have_frame);
+
+ if (have_frame) {
+#ifdef USE_POOL
+ if (media_packet_pool_acquire_packet(pkt_pool, &pkt, -1) != MEDIA_PACKET_ERROR_NONE) {
+ g_print("media_packet_pool_aquire_packet failed\n");
+ return;
+ }
+#else
+ if (media_packet_create_alloc(fmt, NULL, NULL, &pkt) != MEDIA_PACKET_ERROR_NONE) {
+ g_print("media_packet_create_alloc failed\n");
+ return;
+ }
+#endif
+
+ if (media_packet_set_pts(pkt, (uint64_t)(pts)) != MEDIA_PACKET_ERROR_NONE) {
+ g_print("media_packet_set_pts failed\n");
+ return;
+ }
+
+ if (app->type != VIDEO_ENC) {
+ media_packet_get_buffer_data_ptr(pkt, &buf_data_ptr);
+ media_packet_set_buffer_size(pkt, (uint64_t)read);
+
+ memcpy(buf_data_ptr, tmp, read);
+ g_print("tmp:%p, read:%d\n", tmp, read);
+ } else {
+ /* Y */
+ media_packet_get_video_plane_data_ptr(pkt, 0, &buf_data_ptr);
+ media_packet_get_video_stride_width(pkt, 0, &stride_width);
+ offset = app->width*app->height;
+
+ for (i = 0; i < app->height; i++) {
+ memcpy(buf_data_ptr, tmp, app->width);
+ buf_data_ptr += stride_width;
+ tmp += app->width;
+ }
+
+ if (app->hardware == TRUE) {
+ media_packet_get_video_plane_data_ptr(pkt, 1, &buf_data_ptr);
+ media_packet_get_video_stride_width(pkt, 1, &stride_width);
+ size = app->width * app->height / 2;
+
+ for (i = 0; i < app->height / 2; i++) {
+ memcpy(buf_data_ptr, tmp, app->width);
+ buf_data_ptr += stride_width;
+ tmp += app->width;
+ }
+ } else {
+ /* U */
+ media_packet_get_video_plane_data_ptr(pkt, 1, &buf_data_ptr);
+ media_packet_get_video_stride_width(pkt, 1, &stride_width);
+ size = (app->width>>1) * (app->height>>1);
+
+ for (i = 0; i < app->height/2; i++) {
+ memcpy(buf_data_ptr, tmp, app->width/2);
+ buf_data_ptr += stride_width;
+ tmp += app->width/2;
+ }
+
+ /* V */
+ media_packet_get_video_plane_data_ptr(pkt, 2, &buf_data_ptr);
+ media_packet_get_video_stride_width(pkt, 2, &stride_width);
+ offset += size;
+
+ for (i = 0; i < app->height/2; i++) {
+ memcpy(buf_data_ptr, tmp, app->width/2);
+ buf_data_ptr += stride_width;
+ tmp += app->width/2;
+ }
+
+ }
+ }
+ mc_hex_dump("inbuf", tmp, 48);
+
+ ret = mediacodec_process_input(app->mc_handle[0], pkt, 1000);
+ if (ret != MEDIACODEC_ERROR_NONE)
+ return;
+
+ pts += ES_DEFAULT_VIDEO_PTS_OFFSET;
+ }
+ }
}
static gboolean read_data(App *app)
{
- guint len;
- bool have_frame = FALSE;
- int ret;
- static guint64 pts = 0L;
- void *buf_data_ptr = NULL;
- media_packet_h pkt = NULL;
- unsigned char *tmp;
- int read;
- int plane_num;
- int offset;
- int stride_width, stride_height;
-
- g_print("----------read data------------\n");
- //read = extractor(app, app->data + app->offset, app->length - app->offset );
- extractor(app, &tmp, &read, &have_frame);
-
- if ( app->offset >= app->length - 1 ) {
- /* EOS */
- //media_packet_set_flags(in_buf, MEDIA_PACKET_END_OF_STREAM);
- g_print("EOS\n");
- app->finish = clock();
- g_main_loop_quit (app->loop);
- return FALSE;
- }
- g_print("length : %d, offset : %d\n", app->length, app->offset);
-
- if ( app->offset + len > app->length )
- len = app->length - app->offset;
-
- g_print("%p, %d, have_frame :%d, read: %d\n", tmp, (int)read, have_frame, read);
-
- if (have_frame) {
- if (media_packet_create_alloc(vdec_fmt, NULL, NULL, &pkt) != MEDIA_PACKET_ERROR_NONE) {
- fprintf(stderr, "media_packet_create_alloc failed\n");
- return FALSE;
- }
-
- if (media_packet_set_pts(pkt, (uint64_t)(pts)) != MEDIA_PACKET_ERROR_NONE) {
- fprintf(stderr, "media_packet_set_pts failed\n");
- return FALSE;
- }
-
- if (app->type != VIDEO_ENC) {
- media_packet_get_buffer_data_ptr(pkt, &buf_data_ptr);
- media_packet_set_buffer_size(pkt, (uint64_t)read);
-
- memcpy(buf_data_ptr, tmp, read);
- g_print("tmp:%p, read:%d\n",tmp, read);
- } else {
- /* Y */
- media_packet_get_video_plane_data_ptr(pkt, 0, &buf_data_ptr);
- media_packet_get_video_stride_width(pkt, 0, &stride_width);
- media_packet_get_video_stride_height(pkt, 0, &stride_height);
-
- offset = stride_width*stride_height;
-
- memcpy(buf_data_ptr, tmp, offset);
-
- /* UV or U*/
- media_packet_get_video_plane_data_ptr(pkt, 1, &buf_data_ptr);
- media_packet_get_video_stride_width(pkt, 1, &stride_width);
- media_packet_get_video_stride_height(pkt, 1, &stride_height);
- memcpy(buf_data_ptr, tmp + offset, stride_width*stride_height);
-
- if (app->hardware == FALSE) {
- /* V */
- media_packet_get_video_plane_data_ptr(pkt, 2, &buf_data_ptr);
- media_packet_get_video_stride_width(pkt, 2, &stride_width);
- media_packet_get_video_stride_height(pkt, 2, &stride_height);
-
- offset += stride_width * stride_height;
-
-
- memcpy(buf_data_ptr, tmp + offset, stride_width*stride_height);
- }
- }
- mc_hex_dump("inbuf", tmp, 48);
-
- ret = mediacodec_process_input(app->mc_handle[0], pkt, 0);
- if(ret != MEDIACODEC_ERROR_NONE) {
- return FALSE;
- }
- pts += ES_DEFAULT_VIDEO_PTS_OFFSET;
- }
- //app->offset += read;
-
- return TRUE;
+ guint len = 0;
+ bool have_frame = FALSE;
+ int ret;
+ static guint64 pts = 0L;
+ void *buf_data_ptr = NULL;
+ media_packet_h pkt = NULL;
+ unsigned char *tmp;
+ int i;
+ int read;
+ int size;
+ int offset;
+ int stride_width;
+
+ if (app->offset == 0) {
+ app->frame_count = 0;
+ app->start = clock();
+ }
+
+ g_print("----------read data------------\n");
+ extractor(app, &tmp, &read, &have_frame);
+
+ if (app->offset >= app->length - 4) {
+ /* EOS */
+ g_print("EOS\n");
+ app->finish = clock();
+ g_print("Average FPS = %3.3f\n", ((double)app->frame_count*1000000/(app->finish - app->start)));
+ g_print("---------------------------\n");
+ return FALSE;
+ }
+ g_print("length : %d, offset : %d\n", app->length, app->offset);
+
+ if (app->offset + len > app->length)
+ len = app->length - app->offset;
+
+ g_print("%p, %d, have_frame :%d, read: %d\n", tmp, (int)read, have_frame, read);
+
+ if (have_frame) {
+#ifdef USE_POOL
+ if (media_packet_pool_acquire_packet(pkt_pool, &pkt, -1) != MEDIA_PACKET_ERROR_NONE) {
+ g_print("media_packet_pool_aquire_packet failed\n");
+ return FALSE;
+ }
+#else
+ if (media_packet_create_alloc(fmt, NULL, NULL, &pkt) != MEDIA_PACKET_ERROR_NONE) {
+ g_print("media_packet_create_alloc failed\n");
+ return FALSE;
+ }
+#endif
+ if (media_packet_set_pts(pkt, (uint64_t)(pts)) != MEDIA_PACKET_ERROR_NONE) {
+ g_print("media_packet_set_pts failed\n");
+ return FALSE;
+ }
+
+
+ if (app->type != VIDEO_ENC) {
+ media_packet_get_buffer_data_ptr(pkt, &buf_data_ptr);
+ media_packet_set_buffer_size(pkt, (uint64_t)read);
+
+ memcpy(buf_data_ptr, tmp, read);
+ g_print("tmp:%p, read:%d\n", tmp, read);
+ } else {
+ /* Y */
+ media_packet_get_video_plane_data_ptr(pkt, 0, &buf_data_ptr);
+ media_packet_get_video_stride_width(pkt, 0, &stride_width);
+ offset = app->width*app->height;
+
+ for (i = 0; i < app->height; i++) {
+ memcpy(buf_data_ptr, tmp, app->width);
+ buf_data_ptr += stride_width;
+ tmp += app->width;
+ }
+
+ if (app->hardware == TRUE) {
+ media_packet_get_video_plane_data_ptr(pkt, 1, &buf_data_ptr);
+ media_packet_get_video_stride_width(pkt, 1, &stride_width);
+ size = app->width * app->height>>1;
+
+ for (i = 0; i < app->height>>1; i++) {
+ memcpy(buf_data_ptr, tmp, app->width);
+ buf_data_ptr += stride_width;
+ tmp += app->width;
+ }
+
+ } else {
+ /* U */
+ media_packet_get_video_plane_data_ptr(pkt, 1, &buf_data_ptr);
+ media_packet_get_video_stride_width(pkt, 1, &stride_width);
+ size = (app->width>>1) * (app->height>>1);
+
+ for (i = 0; i < app->height/2; i++) {
+ memcpy(buf_data_ptr, tmp, app->width>>1);
+ buf_data_ptr += stride_width;
+ tmp += (app->width>>1);
+ }
+
+ /* V */
+ media_packet_get_video_plane_data_ptr(pkt, 2, &buf_data_ptr);
+ media_packet_get_video_stride_width(pkt, 2, &stride_width);
+ offset += size;
+
+ for (i = 0; i < app->height/2; i++) {
+ memcpy(buf_data_ptr, tmp, app->width>>1);
+ buf_data_ptr += stride_width;
+ tmp += (app->width>>1);
+ }
+
+ }
+ }
+ mc_hex_dump("inbuf", tmp, 48);
+
+ ret = mediacodec_process_input(app->mc_handle[0], pkt, 0);
+ if (ret != MEDIACODEC_ERROR_NONE)
+ return FALSE;
+
+ pts += ES_DEFAULT_VIDEO_PTS_OFFSET;
+ }
+
+ return TRUE;
}
static void start_feed(App *app)
{
- if (app->sourceid == 0) {
- //start feeding
- app->sourceid = g_idle_add((GSourceFunc)read_data, app);
- g_print("start_feed\n");
- }
+ if (app->sourceid == 0) {
+ app->sourceid = g_idle_add((GSourceFunc)read_data, app);
+ g_print("start_feed\n");
+ }
}
static void stop_feed(App *app)
{
- if (app->sourceid != 0) {
- //stop feeding
- g_source_remove(app->sourceid);
- app->sourceid = 0;
- g_print("stop_feed\n");
- }
+ if (app->sourceid != 0) {
+ g_source_remove(app->sourceid);
+ app->sourceid = 0;
+ g_print("stop_feed\n");
+ }
}
-static bool _mediacodec_inbuf_used_cb(media_packet_h pkt, void *user_data)
+static gboolean _mediacodec_inbuf_used_cb(media_packet_h pkt, void *user_data)
{
- g_print("_mediacodec_inbuf_used_cb!!!\n");
- media_packet_destroy(pkt);
- return TRUE;
+ g_print("_mediacodec_inbuf_used_cb!!!\n");
+#ifdef USE_POOL
+ media_packet_pool_release_packet(pkt_pool, pkt);
+#else
+ media_packet_destroy(pkt);
+#endif
+
+ return TRUE;
}
static bool _mediacodec_outbuf_available_cb(media_packet_h pkt, void *user_data)
{
- media_packet_h out_pkt = NULL;
- int ret;
+ media_packet_h out_pkt = NULL;
+ int ret;
- App *app = (App*)user_data;
+ App *app = (App*)user_data;
- g_print("_mediacodec_outbuf_available_cb\n");
+ g_print("_mediacodec_outbuf_available_cb\n");
- g_mutex_lock(&app->lock);
+ g_mutex_lock(&app->lock);
- ret = mediacodec_get_output(app->mc_handle[0], &out_pkt, 0);
- if (ret != MEDIACODEC_ERROR_NONE) {
- g_print("get_output failed\n");
- }
- decoder_output_dump(app, out_pkt);
+ ret = mediacodec_get_output(app->mc_handle[0], &out_pkt, 0);
-#if DUMP_OUTBUF
- void *data;
- uint64_t buf_size;
- int stride_width, stride_height;
+ if (ret != MEDIACODEC_ERROR_NONE)
+ g_print("get_output failed\n");
- media_packet_get_buffer_data_ptr(out_pkt, &data);
- media_packet_get_buffer_size(out_pkt, &buf_size);
- g_print("output data : %p, size %d\n",data, (int)buf_size);
+ if (app->enable_dump) {
+ if (app->type == VIDEO_DEC)
+ decoder_output_dump(app, out_pkt);
+ else
+ output_dump(app, out_pkt);
+ }
- fwrite(data, 1, buf_size, fp_out);
+ app->frame_count++;
-#endif
-
- app->frame_count++;
+ g_mutex_unlock(&app->lock);
- g_mutex_unlock(&app->lock);
+ media_packet_destroy(out_pkt);
+ out_pkt = NULL;
+ g_print("done\n");
- media_packet_destroy(out_pkt);
- out_pkt = NULL;
- g_print("done\n");
-
- return TRUE;
+ return TRUE;
}
static bool _mediacodec_buffer_status_cb(mediacodec_status_e status, void *user_data)
{
- g_print("_mediacodec_buffer_status_cb %d\n", status);
+ g_print("_mediacodec_buffer_status_cb %d\n", status);
+
+ App *app = (App*)user_data;
- App *app = (App*)user_data;
+ if (status == MEDIACODEC_NEED_DATA)
+ start_feed(app);
+ else if (status == MEDIACODEC_ENOUGH_DATA)
+ stop_feed(app);
- if (status == MEDIACODEC_NEED_DATA) {
- start_feed(app);
- } else if (status == MEDIACODEC_ENOUGH_DATA ){
- stop_feed(app);
- }
- return TRUE;
+ return TRUE;
}
static bool _mediacodec_error_cb(mediacodec_error_e error, void *user_data)
{
- return TRUE;
+ return TRUE;
}
static bool _mediacodec_eos_cb(void *user_data)
{
- return TRUE;
+ return TRUE;
}
-static void _mediacodec_prepare(App *app)
+gboolean _foreach_cb(mediacodec_codec_type_e codec_type, void *user_data)
{
- int ret;
- media_format_mimetype_e mime;
+ g_print("codec type : %x %s\n", codec_type, codec_type_to_string(codec_type));
+ return TRUE;
+}
-#if DUMP_OUTBUF
- fp_out = fopen("/tmp/codec_dump.out", "wb");
-#endif
- /* create instance */
- ret = mediacodec_create(&app->mc_handle[0]);
- if (ret != MEDIACODEC_ERROR_NONE) {
- g_print("mediacodec_create failed\n");
- return;
- }
-
- /* set codec */
- ret = mediacodec_set_codec(app->mc_handle[0], app->codecid, app->flag);
- if (ret != MEDIACODEC_ERROR_NONE) {
- g_print("mediacodec_set_codec failed\n");
- return;
- }
-
-
- app->mime = _mediacodec_set_codec(app->codecid, app->flag, &app->hardware);
-
- /* set codec info */
- ret = media_format_create(&vdec_fmt);
-
- switch (app->type) {
- case VIDEO_DEC:
- ret = mediacodec_set_vdec_info(app->mc_handle[0], app->width, app->height);
- media_format_set_video_mime(vdec_fmt, app->mime);
- media_format_set_video_width(vdec_fmt, app->width);
- media_format_set_video_height(vdec_fmt, app->height);
- break;
- case VIDEO_ENC:
- ret = mediacodec_set_venc_info(app->mc_handle[0], app->width, app->height, app->fps, app->target_bits);
- media_format_set_video_mime(vdec_fmt, app->mime);
- media_format_set_video_width(vdec_fmt, app->width);
- media_format_set_video_height(vdec_fmt, app->height);
- media_format_set_video_avg_bps(vdec_fmt, app->target_bits);
- break;
- case AUDIO_DEC:
- ret = mediacodec_set_adec_info(app->mc_handle[0], app->samplerate, app->channel, app->bit);
- media_format_set_audio_mime(vdec_fmt, app->mime);
- media_format_set_audio_channel(vdec_fmt, app->channel);
- media_format_set_audio_samplerate(vdec_fmt, app->samplerate);
- media_format_set_audio_bit(vdec_fmt, app->bit);
- break;
- case AUDIO_ENC:
- ret = mediacodec_set_aenc_info(app->mc_handle[0], app->samplerate, app->channel, app->bit, app->bitrate);
- media_format_set_audio_mime(vdec_fmt, app->mime);
- media_format_set_audio_channel(vdec_fmt, app->channel);
- media_format_set_audio_samplerate(vdec_fmt, app->samplerate);
- media_format_set_audio_bit(vdec_fmt, app->bit);
- break;
- default:
- g_print("invaild type\n");
- break;
- }
- if (ret != MEDIACODEC_ERROR_NONE) {
- g_print("mediacodec_set_xxxc(%d)_info failed\n", app->type);
- return;
- }
-
-
- /* set callback */
- mediacodec_set_input_buffer_used_cb(app->mc_handle[0], _mediacodec_inbuf_used_cb, NULL);
- mediacodec_set_output_buffer_available_cb(app->mc_handle[0], _mediacodec_outbuf_available_cb, app);
- mediacodec_set_buffer_status_cb(app->mc_handle[0], _mediacodec_buffer_status_cb, app);
- mediacodec_set_eos_cb(app->mc_handle[0],_mediacodec_eos_cb, NULL);
- mediacodec_set_error_cb(app->mc_handle[0], _mediacodec_error_cb, NULL);
-
-
- /* prepare */
- ret = mediacodec_prepare(app->mc_handle[0]);
- if (ret != MEDIACODEC_ERROR_NONE) {
- g_print("mediacodec_prepare failed\n");
- return;
- }
-
- app->frame_count = 0;
- app->start = clock();
- g_main_loop_run(app->loop);
-
- g_print("Average FPS = %3.3f\n", ((double)app->frame_count*1000000/(app->finish - app->start)));
-
- g_print("---------------------------\n");
-
-
- return;
+static void _mediacodec_prepare(App *app, bool frame_all)
+{
+ int ret;
+
+ g_print("supported codec lists -internal-\n");
+ mediacodec_foreach_supported_codec_static((mediacodec_supported_codec_cb)_foreach_cb, app);
+
+ /* create instance */
+ ret = mediacodec_create(&app->mc_handle[0]);
+ if (ret != MEDIACODEC_ERROR_NONE) {
+ g_print("mediacodec_create failed\n");
+ return;
+ }
+
+ /* set codec */
+ ret = mediacodec_set_codec(app->mc_handle[0], app->codecid, app->flag);
+ if (ret != MEDIACODEC_ERROR_NONE) {
+ g_print("mediacodec_set_codec failed\n");
+ return;
+ }
+
+ app->mime = _mediacodec_set_codec(app, app->codecid, app->flag, &app->hardware);
+
+ /* set codec info */
+ ret = media_format_create(&fmt);
+
+ switch (app->type) {
+ case VIDEO_DEC:
+ ret = mediacodec_set_vdec_info(app->mc_handle[0], app->width, app->height);
+ media_format_set_video_mime(fmt, app->mime);
+ media_format_set_video_width(fmt, app->width);
+ media_format_set_video_height(fmt, app->height);
+ break;
+ case VIDEO_ENC:
+ ret = mediacodec_set_venc_info(app->mc_handle[0], app->width, app->height, app->fps, app->target_bits);
+ media_format_set_video_mime(fmt, app->mime);
+ media_format_set_video_width(fmt, app->width);
+ media_format_set_video_height(fmt, app->height);
+ media_format_set_video_avg_bps(fmt, app->target_bits);
+ break;
+ case AUDIO_DEC:
+ ret = mediacodec_set_adec_info(app->mc_handle[0], app->samplerate, app->channel, app->bit);
+ media_format_set_audio_mime(fmt, app->mime);
+ media_format_set_audio_channel(fmt, app->channel);
+ media_format_set_audio_samplerate(fmt, app->samplerate);
+ media_format_set_audio_bit(fmt, app->bit);
+ break;
+ case AUDIO_ENC:
+ ret = mediacodec_set_aenc_info(app->mc_handle[0], app->samplerate, app->channel, app->bit, app->bitrate);
+ media_format_set_audio_mime(fmt, app->mime);
+ media_format_set_audio_channel(fmt, app->channel);
+ media_format_set_audio_samplerate(fmt, app->samplerate);
+ media_format_set_audio_bit(fmt, app->bit);
+ break;
+ default:
+ g_print("invaild type\n");
+ break;
+ }
+
+ if (ret != MEDIACODEC_ERROR_NONE) {
+ g_print("mediacodec_set_xxxc(%d)_info failed\n", app->type);
+ return;
+ }
+
+ /* set callback */
+ g_print("supported codec lists\n");
+ mediacodec_foreach_supported_codec(app->mc_handle[0], (mediacodec_supported_codec_cb)_foreach_cb, app);
+ mediacodec_set_input_buffer_used_cb(app->mc_handle[0], (mediacodec_input_buffer_used_cb)_mediacodec_inbuf_used_cb, NULL);
+ mediacodec_set_output_buffer_available_cb(app->mc_handle[0], (mediacodec_output_buffer_available_cb) _mediacodec_outbuf_available_cb, app);
+ if (frame_all)
+ mediacodec_set_buffer_status_cb(app->mc_handle[0], (mediacodec_buffer_status_cb) _mediacodec_buffer_status_cb, app);
+ mediacodec_set_eos_cb(app->mc_handle[0], (mediacodec_eos_cb)_mediacodec_eos_cb, NULL);
+ mediacodec_set_error_cb(app->mc_handle[0], (mediacodec_error_cb)_mediacodec_error_cb, NULL);
+
+ /* prepare */
+ ret = mediacodec_prepare(app->mc_handle[0]);
+ if (ret != MEDIACODEC_ERROR_NONE) {
+ g_print("mediacodec_prepare failed\n");
+ return;
+ }
+
+
+/* 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;
}
-/**
- *
- *
-* @param filename
-*/
-static void input_filepath(char *filename, App *app)
+static void _mediacodec_enc_input_buffer_used_cb(media_packet_h pkt, void *user_data)
{
- GError *error = NULL;
+ /* release input raw packet */
+ media_packet_destroy(pkt);
+}
- app->obj++;
- app->file = g_mapped_file_new (filename, FALSE, &error);
- if (error) {
- g_print ("failed to open file : %s\n", error->message);
- g_error_free(error);
- return -1;
- }
+/* 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);
+}
- app->length = g_mapped_file_get_length (app->file);
- app->data = (guint8 *) g_mapped_file_get_contents (app->file);
- app->offset = 0;
- g_print("len : %d, offset : %d, obj : %d", app->length, (int)app->offset, app->obj);
+static void _mediacodec_enc_output_buffer_available_cb(media_packet_h pkt, void *user_data)
+{
+ App *app = (App*)user_data;
-/*
- if ( mediacodec_create(&app->mc_handle[app->obj]) != MEDIACODEC_ERROR_NONE) {
- g_print("mediacodec_create failed\n");
- }
-*/
-#if 0
- if(len < 0 || len > MAX_STRING_LEN)
- return;
-
- for(i = 0; i < g_handle_num; i++)
- {
- if(g_media_codec[i] != NULL)
- {
- mediacodec_unprepare(g_media_codec[i]);
- mediacodec_destroy(g_media_codec[i]);
- g_media_codec[i] = NULL;
- }
-
- if (mediacodec_create(&g_media_codec[i]) != MEDIACODEC_ERROR_NONE)
- {
- g_print("mediacodec create is failed\n");
- }
- }
- //input_fmt = (media_format_s *) malloc(sizeof(media_format_s));
- //memset(input_fmt, 0, sizeof(media_format_s));
- media_format_create(&input_fmt);
-
-#if DUMP_OUTBUF
- fp_out = fopen("/opt/usr/media/codec_dump.out", "wb");
-#endif
+ 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);
+}
- strncpy (g_uri, filename, len);
-#endif
- return;
+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;
}
-void quit_program()
+static void _mediacodec_camera_start(App *app)
{
- //g_main_loop_quit (app->loop);
-#if DUMP_OUTBUF
- if (fp_out)
- fclose(fp_out);
+ 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]);
+}
+
+static void _mediacodec_destroy(App *app)
+{
+#ifdef USE_POOL
+ if (media_packet_pool_deallocate(pkt_pool) != MEDIA_PACKET_ERROR_NONE) {
+
+ g_print("media_packet_pool_deallocatet failed\n");
+ return;
+ }
+
+ if (media_packet_pool_destroy(pkt_pool) != MEDIA_PACKET_ERROR_NONE) {
+
+ g_print(" media_packet_pool_destroy failed\n");
+ return;
+ }
+ g_print("media packet pool destroyed! \n");
#endif
+ mediacodec_destroy(app->mc_handle[0]);
+}
+
+static void input_filepath(char *filename, App *app)
+{
+ GError *error = NULL;
+
+ app->obj++;
+ app->file = g_mapped_file_new(filename, FALSE, &error);
+ if (error) {
+ g_print("failed to open file : %s\n", error->message);
+ g_error_free(error);
+ return;
+ }
+
+ app->length = g_mapped_file_get_length(app->file);
+ app->data = (guint8 *)g_mapped_file_get_contents(app->file);
+ app->offset = 0;
+ g_print("len : %d, offset : %d, obj : %d", app->length, app->offset, app->obj);
+
+ return;
+}
+
+void quit_program(App *app)
+{
+ media_format_unref(fmt);
+ g_main_loop_quit(app->loop);
+ elm_exit();
}
void reset_menu_state()
{
- g_menu_state = CURRENT_STATUS_MAINMENU;
- return;
+ g_menu_state = CURRENT_STATUS_MAINMENU;
+ return;
}
void _interpret_main_menu(char *cmd, App *app)
{
- int len = strlen(cmd);
- if (len == 1)
- {
- if (strncmp(cmd, "a", 1) == 0) {
- g_menu_state = CURRENT_STATUS_FILENAME;
- } else if (strncmp(cmd, "o", 1) == 0) {
- g_menu_state = CURRENT_STATUS_GET_OUTPUT;
- } else if (strncmp(cmd, "q", 1) == 0)
- {
- quit_program();
- //g_main_loop_quit (app->loop);
- } else {
- g_print("unknown menu \n");
- }
- } else if (len == 2) {
- if (strncmp(cmd, "pr", 2) == 0) {
- _mediacodec_prepare(app);
- } else if (strncmp(cmd, "sc", 2) == 0) {
- g_menu_state = CURRENT_STATUS_SET_CODEC;
- } else if (strncmp(cmd, "vd", 2) == 0) {
- g_menu_state = CURRENT_STATUS_SET_VDEC_INFO;
- } else if (strncmp(cmd, "ve", 2) == 0) {
- g_menu_state = CURRENT_STATUS_SET_VENC_INFO;
- } else if (strncmp(cmd, "ad", 2) == 0) {
- g_menu_state = CURRENT_STATUS_SET_ADEC_INFO;
- } else if (strncmp(cmd, "ae", 2) == 0) {
- g_menu_state = CURRENT_STATUS_SET_AENC_INFO;
- } else if (strncmp(cmd, "pi", 2) == 0) {
- g_menu_state = CURRENT_STATUS_PROCESS_INPUT;
- } else if (strncmp(cmd, "rb", 2) == 0) {
- //_mediacodec_reset_output_buffer();
- } else if (strncmp(cmd, "pa", 2) == 0) {
- //_mediacodec_process_all();
- } else if (strncmp(cmd, "un", 2) == 0) {
- //_mediacodec_unprepare();
- } else if (strncmp(cmd, "dt", 2) == 0) {
- //_mediacodec_destroy();
- } else {
- //g_print("unknown menu \n");
- display_sub_basic();
- }
- } else {
- g_print("unknown menu \n");
- }
-
- return;
+ int len = strlen(cmd);
+ if (len == 1) {
+ if (strncmp(cmd, "a", 1) == 0)
+ g_menu_state = CURRENT_STATUS_FILENAME;
+ else if (strncmp(cmd, "o", 1) == 0)
+ g_menu_state = CURRENT_STATUS_GET_OUTPUT;
+ else if (strncmp(cmd, "q", 1) == 0)
+ quit_program(app);
+ else
+ g_print("unknown menu \n");
+ } else if (len == 2) {
+ if (strncmp(cmd, "pr", 2) == 0)
+ _mediacodec_prepare(app, 0);
+ else if (strncmp(cmd, "pa", 2) == 0)
+ _mediacodec_prepare(app, 1);
+ else if (strncmp(cmd, "sc", 2) == 0)
+ g_menu_state = CURRENT_STATUS_SET_CODEC;
+ else if (strncmp(cmd, "vd", 2) == 0)
+ g_menu_state = CURRENT_STATUS_SET_VDEC_INFO;
+ else if (strncmp(cmd, "ve", 2) == 0)
+ g_menu_state = CURRENT_STATUS_SET_VENC_INFO;
+ else if (strncmp(cmd, "ad", 2) == 0)
+ g_menu_state = CURRENT_STATUS_SET_ADEC_INFO;
+ else if (strncmp(cmd, "ae", 2) == 0)
+ g_menu_state = CURRENT_STATUS_SET_AENC_INFO;
+ else if (strncmp(cmd, "pi", 2) == 0)
+ g_menu_state = CURRENT_STATUS_PROCESS_INPUT;
+ else if (strncmp(cmd, "un", 2) == 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("dump enabled\n");
+ } else {
+ app->enable_dump = FALSE;
+ g_print("dump disabled\n");
+ }
+ } else
+ display_sub_basic();
+ } else {
+ g_print("unknown menu \n");
+ }
+
+ return;
}
static void displaymenu(void)
{
- if (g_menu_state == CURRENT_STATUS_MAINMENU)
- {
- display_sub_basic();
- }
- else if (g_menu_state == CURRENT_STATUS_FILENAME)
- {
- g_print("*** input mediapath.\n");
- }
- else if (g_menu_state == CURRENT_STATUS_SET_CODEC)
- {
- g_print("*** Codec id : Select Codec ID Numbe (e.g. AAC_LC = 96)\n");
- g_print(" L16 = 16 (0x10)\n");
- g_print(" ALAW = 32 (0x20)\n");
- g_print(" ULAW = 48 (0x30)\n");
- g_print(" AMR_NB = 64 (0x40)\n");
- g_print(" AMR_WB = 65 (0x41)\n");
- g_print(" G729 = 80 (0x50)\n");
- g_print(" AAC_LC = 96 (0x60)\n");
- g_print(" AAC_HE = 97 (0x61)\n");
- g_print(" AAC_PS = 98 (0x62)\n");
- g_print(" MP3 = 112 (0x70)\n");
- g_print(" VORBIS = 128 (0x80)\n");
- g_print(" FLAC = 144 (0x90)\n");
- g_print(" WMAV1 = 160 (0xA0)\n");
- g_print(" WMAV2 = 161 (0xA1)\n");
- g_print(" WMAPRO = 162 (0xA2)\n");
- g_print(" WMALSL = 163 (0xA3)\n");
- g_print(" -------------------\n");
- g_print(" H261 = 101\n");
- g_print(" H263 = 102\n");
- g_print(" H264 = 103\n");
- g_print(" MJPEG = 104\n");
- g_print(" MPEG1 = 105\n");
- g_print(" MPEG2 = 106\n");
- g_print(" MPEG4 = 107\n");
- g_print(" -------------------\n");
- g_print("*** Flags : Select Combination Number (e.g. DEOCDER + TYPE_SW = 10)\n");
- g_print(" CODEC : ENCODER = 1 DECODER = 2\n");
- g_print(" TYPE : HW = 4 SW = 8\n");
- g_print("*** input codec id, falgs.\n");
- }
- else if (g_menu_state == CURRENT_STATUS_SET_VDEC_INFO)
- {
- g_print("*** input video decode configure.(width, height)\n");
- }
- else if (g_menu_state == CURRENT_STATUS_SET_VENC_INFO)
- {
- g_print("*** input video encode configure.(width, height, fps, target_bits)\n");
- }
- else if (g_menu_state == CURRENT_STATUS_SET_ADEC_INFO)
- {
- g_print("*** input audio decode configure.(samplerate, channel, bit (e.g. 48000, 2, 16))\n");
- }
- else if (g_menu_state == CURRENT_STATUS_SET_AENC_INFO)
- {
- g_print("*** input audio encode configure.(samplerate, channel, bit, bitrate (e.g. 48000, 2, 16, 128000))\n");
- }
- else if (g_menu_state == CURRENT_STATUS_PROCESS_INPUT)
- {
- g_print("*** input dec process number\n");
- }
- else if (g_menu_state == CURRENT_STATUS_GET_OUTPUT)
- {
- g_print("*** input get output buffer number\n");
- }
- else
- {
- g_print("*** unknown status.\n");
- //quit_program(app);
- }
- g_print(" >>> ");
+ if (g_menu_state == CURRENT_STATUS_MAINMENU) {
+ display_sub_basic();
+ } else if (g_menu_state == CURRENT_STATUS_FILENAME) {
+ g_print("*** input mediapath.\n");
+ } else if (g_menu_state == CURRENT_STATUS_SET_CODEC) {
+ g_print("*** Codec id : Select Codec ID Numbe (e.g. AAC_LC = 96)\n");
+ g_print(" L16 = 16 (0x10)\n");
+ g_print(" ALAW = 32 (0x20)\n");
+ g_print(" ULAW = 48 (0x30)\n");
+ g_print(" AMR_NB = 64 (0x40)\n");
+ g_print(" AMR_WB = 65 (0x41)\n");
+ g_print(" G729 = 80 (0x50)\n");
+ g_print(" AAC_LC = 96 (0x60)\n");
+ g_print(" AAC_HE = 97 (0x61)\n");
+ g_print(" AAC_PS = 98 (0x62)\n");
+ g_print(" MP3 = 112 (0x70)\n");
+ g_print(" VORBIS = 128 (0x80)\n");
+ g_print(" FLAC = 144 (0x90)\n");
+ g_print(" WMAV1 = 160 (0xA0)\n");
+ g_print(" WMAV2 = 161 (0xA1)\n");
+ g_print(" WMAPRO = 162 (0xA2)\n");
+ g_print(" WMALSL = 163 (0xA3)\n");
+ g_print(" -------------------\n");
+ g_print(" H261 = 101\n");
+ g_print(" H263 = 102\n");
+ g_print(" H264 = 103\n");
+ g_print(" MJPEG = 104\n");
+ g_print(" MPEG1 = 105\n");
+ g_print(" MPEG2 = 106\n");
+ g_print(" MPEG4 = 107\n");
+ g_print(" -------------------\n");
+ g_print("*** Flags : Select Combination Number (e.g. DEOCDER + TYPE_SW = 10)\n");
+ g_print(" CODEC : ENCODER = 1 DECODER = 2\n");
+ g_print(" TYPE : HW = 4 SW = 8\n");
+ g_print("*** input codec id, falgs.\n");
+ } else if (g_menu_state == CURRENT_STATUS_SET_VDEC_INFO) {
+ g_print("*** input video decode configure.(width, height)\n");
+ } else if (g_menu_state == CURRENT_STATUS_SET_VENC_INFO) {
+ g_print("*** input video encode configure.(width, height, fps, target_bits)\n");
+ } else if (g_menu_state == CURRENT_STATUS_SET_ADEC_INFO) {
+ g_print("*** input audio decode configure.(samplerate, channel, bit (e.g. 48000, 2, 16))\n");
+ } else if (g_menu_state == CURRENT_STATUS_SET_AENC_INFO) {
+ g_print("*** input audio encode configure.(samplerate, channel, bit, bitrate (e.g. 48000, 2, 16, 128000))\n");
+ } else if (g_menu_state == CURRENT_STATUS_PROCESS_INPUT) {
+ g_print("*** input dec process number\n");
+ } else if (g_menu_state == CURRENT_STATUS_GET_OUTPUT) {
+ g_print("*** input get output buffer number\n");
+ } else {
+ g_print("*** unknown status.\n");
+ }
+ g_print(" >>> ");
}
gboolean timeout_menu_display(void* data)
{
- displaymenu();
- return FALSE;
+ displaymenu();
+ return FALSE;
}
-static void interpret (char *cmd, App *app)
+static void interpret(char *cmd, App *app)
{
- switch (g_menu_state)
- {
- case CURRENT_STATUS_MAINMENU:
- {
- _interpret_main_menu(cmd, app);
- }
- break;
- case CURRENT_STATUS_FILENAME:
- {
- input_filepath(cmd, app);
- reset_menu_state();
- }
- break;
- case CURRENT_STATUS_SET_CODEC:
- {
- int tmp;
- static int cnt = 0;
- char **ptr = NULL;
- switch (cnt)
- {
- case 0:
- tmp = atoi(cmd);
-
- if(tmp > 100 &&
- (tmp != 112) &&
- (tmp != 128) &&
- (tmp != 144) &&
- (tmp != 160) && (tmp != 161) && (tmp != 162) && (tmp != 163)) //Temporary
- {
- tmp = strtol(cmd, ptr, 16);
- app->codecid = 0x2000 + ((tmp & 0xFF) << 4);
- } else {
- app->codecid = 0x1000 + tmp;
- }
- cnt++;
- break;
- case 1:
- app->flag = atoi(cmd);
- cnt = 0;
- reset_menu_state();
- break;
- default:
- break;
- }
- }
- break;
- case CURRENT_STATUS_SET_VDEC_INFO:
- {
- static int cnt = 0;
- switch (cnt)
- {
- case 0:
- app->width = atoi(cmd);
- cnt++;
- break;
- case 1:
- app->height = atoi(cmd);
- app->type = VIDEO_DEC;
-
- reset_menu_state();
- cnt = 0;
- break;
- default:
- break;
- }
- }break;
- case CURRENT_STATUS_SET_VENC_INFO:
- {
- static int cnt = 0;
- switch (cnt) {
- case 0:
- app->width = atoi(cmd);
- cnt++;
- break;
- case 1:
- app->height = atoi(cmd);
- cnt++;
- break;
- case 2:
- app->fps = atol(cmd);
- cnt++;
- break;
- case 3:
- app->target_bits = atoi(cmd);
- app->type = VIDEO_ENC;
-
- reset_menu_state();
- cnt = 0;
- break;
- default:
- break;
- }
- }
- break;
- case CURRENT_STATUS_SET_ADEC_INFO:
- {
- static int cnt = 0;
- switch (cnt)
- {
- case 0:
- app->samplerate = atoi(cmd);
- cnt++;
- break;
- case 1:
- app->channel = atoi(cmd);
- cnt++;
- break;
- case 2:
- app->bit = atoi(cmd);
- app->type = AUDIO_DEC;
-
- reset_menu_state();
- cnt = 0;
- break;
- default:
- break;
- }
- }break;
- case CURRENT_STATUS_SET_AENC_INFO:
- {
- static int cnt = 0;
- switch (cnt)
- {
- case 0:
- app->samplerate = atoi(cmd);
- cnt++;
- break;
- case 1:
- app->channel = atoi(cmd);
- cnt++;
- break;
- case 2:
- app->bit = atoi(cmd);
- cnt++;
- break;
- case 3:
- app->bitrate = atoi(cmd);
- app->type = AUDIO_ENC;
-
- reset_menu_state();
- cnt = 0;
- break;
- default:
- break;
- }
- }break;
- case CURRENT_STATUS_PROCESS_INPUT:
- {
- static int num = 0;
- num = atoi(cmd);
- //_mediacodec_process_input_n(num);
- reset_menu_state();
- }
- break;
- case CURRENT_STATUS_GET_OUTPUT:
- {
- static int num = 0;
- num = atoi(cmd);
- //_mediacodec_get_output_n(num);
- reset_menu_state();
- }
- break;
- default:
- break;
- }
-
- g_timeout_add(100, timeout_menu_display, 0);
+ switch (g_menu_state) {
+ case CURRENT_STATUS_MAINMENU:
+ _interpret_main_menu(cmd, app);
+ break;
+ case CURRENT_STATUS_FILENAME:
+ input_filepath(cmd, app);
+ reset_menu_state();
+ break;
+ case CURRENT_STATUS_SET_CODEC:
+ {
+ int tmp;
+ static int cnt = 0;
+ char **ptr = NULL;
+ switch (cnt) {
+ case 0:
+ tmp = atoi(cmd);
+
+ if (tmp > 100 &&
+ (tmp != 112) &&
+ (tmp != 128) &&
+ (tmp != 144) &&
+ (tmp != 160) && (tmp != 161) && (tmp != 162) && (tmp != 163)) {
+ tmp = strtol(cmd, ptr, 16);
+ app->codecid = 0x2000 + ((tmp & 0xFF) << 4);
+ } else
+ app->codecid = 0x1000 + tmp;
+
+ cnt++;
+ break;
+ case 1:
+ app->flag = atoi(cmd);
+ cnt = 0;
+ reset_menu_state();
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ case CURRENT_STATUS_SET_VDEC_INFO:
+ {
+ static int cnt = 0;
+ switch (cnt) {
+ case 0:
+ app->width = atoi(cmd);
+ cnt++;
+ break;
+ case 1:
+ app->height = atoi(cmd);
+ app->type = VIDEO_DEC;
+
+ reset_menu_state();
+ cnt = 0;
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ case CURRENT_STATUS_SET_VENC_INFO:
+ {
+ static int cnt = 0;
+ switch (cnt) {
+ case 0:
+ app->width = atoi(cmd);
+ cnt++;
+ break;
+ case 1:
+ app->height = atoi(cmd);
+ cnt++;
+ break;
+ case 2:
+ app->fps = atol(cmd);
+ cnt++;
+ break;
+ case 3:
+ app->target_bits = atoi(cmd);
+ app->type = VIDEO_ENC;
+
+ reset_menu_state();
+ cnt = 0;
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ case CURRENT_STATUS_SET_ADEC_INFO:
+ {
+ static int cnt = 0;
+ switch (cnt) {
+ case 0:
+ app->samplerate = atoi(cmd);
+ cnt++;
+ break;
+ case 1:
+ app->channel = atoi(cmd);
+ cnt++;
+ break;
+ case 2:
+ app->bit = atoi(cmd);
+ app->type = AUDIO_DEC;
+
+ reset_menu_state();
+ cnt = 0;
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ case CURRENT_STATUS_SET_AENC_INFO:
+ {
+ static int cnt = 0;
+ switch (cnt) {
+ case 0:
+ app->samplerate = atoi(cmd);
+ cnt++;
+ break;
+ case 1:
+ app->channel = atoi(cmd);
+ cnt++;
+ break;
+ case 2:
+ app->bit = atoi(cmd);
+ cnt++;
+ break;
+ case 3:
+ app->bitrate = atoi(cmd);
+ app->type = AUDIO_ENC;
+
+ reset_menu_state();
+ cnt = 0;
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ case CURRENT_STATUS_PROCESS_INPUT:
+ {
+ app->frame = atoi(cmd);
+
+ if (app->frame > 0 && app->frame < 10)
+ _mediacodec_process_input(app);
+ reset_menu_state();
+ }
+ break;
+ case CURRENT_STATUS_GET_OUTPUT:
+ {
+ reset_menu_state();
+ }
+ break;
+ default:
+ break;
+ }
+
+ g_timeout_add(100, timeout_menu_display, 0);
}
static void display_sub_basic()
{
- g_print("\n");
- g_print("=========================================================================================\n");
- g_print(" media codec test\n");
- g_print("-----------------------------------------------------------------------------------------\n");
- g_print("a. Create \t\t");
- g_print("sc. Set codec \n");
- g_print("vd. Set vdec info \t");
- g_print("ve. Set venc info \n");
- g_print("ad. Set adec info \t");
- g_print("ae. Set aenc info \n");
- g_print("pr. Prepare \t\t");
- g_print("pi. Process input \n");
- g_print("o. Get output \t\t");
- g_print("rb. Reset output buffer \n");
- g_print("pa. Process all frames \n");
- g_print("un. Unprepare \t\t");
- g_print("dt. Destroy \t\t");
- g_print("q. quite test suite \t");
- g_print("\n");
- g_print("=========================================================================================\n");
+ g_print("\n");
+ g_print("=========================================================================================\n");
+ g_print(" media codec test\n");
+ g_print("-----------------------------------------------------------------------------------------\n");
+ g_print("a. Create \t\t");
+ g_print("sc. Set codec \n");
+ g_print("vd. Set vdec info \t");
+ g_print("ve. Set venc info \n");
+ g_print("ad. Set adec info \t");
+ g_print("ae. Set aenc info \n");
+ g_print("pr. Prepare \t");
+ g_print("pa. Prepare and process all\t\t");
+ g_print("pi. process input with num\n");
+ g_print("o. Get output \t\t");
+ g_print("rb. Reset output buffer \n");
+ g_print("un. Unprepare \t\t");
+ g_print("dt. Destroy \t\t");
+ 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");
}
-gboolean input (GIOChannel *channel, GIOCondition cond, gpointer data)
+gboolean input(GIOChannel *channel, GIOCondition cond, gpointer data)
{
- gchar buf[MAX_STRING_LEN];
- gsize read;
- GError *error = NULL;
- App *context = (App*)data;
+ gchar buf[MAX_STRING_LEN];
+ gsize read;
+ GError *error = NULL;
+ App *context = (App*)data;
- g_io_channel_read_chars(channel, buf, MAX_STRING_LEN, &read, &error);
- buf[read] = '\0';
- g_strstrip(buf);
- interpret (buf, context);
+ g_io_channel_read_chars(channel, buf, MAX_STRING_LEN, &read, &error);
+ buf[read] = '\0';
+ g_strstrip(buf);
+ interpret(buf, context);
- return TRUE;
+ return TRUE;
}
+
int main(int argc, char *argv[])
{
- App *app = &s_app;
- //app->obj = -1;
+ App *app = &s_app;
- GError *error = NULL;
- GIOChannel *stdin_channel;
- stdin_channel = g_io_channel_unix_new(0);
- g_io_channel_set_flags (stdin_channel, G_IO_FLAG_NONBLOCK, NULL);
- g_io_add_watch (stdin_channel, G_IO_IN, (GIOFunc)input, app);
+ GIOChannel *stdin_channel;
+ stdin_channel = g_io_channel_unix_new(0);
+ g_io_channel_set_flags(stdin_channel, G_IO_FLAG_NONBLOCK, NULL);
+ g_io_add_watch(stdin_channel, G_IO_IN, (GIOFunc)input, app);
- app->loop = g_main_loop_new(NULL, TRUE);
- app->timer = g_timer_new();
- /*
- app->file = g_mapped_file_new ("/opt/usr/media/Simpsons.h264", FALSE, &error);
- if (error) {
- g_print ("failed to open file : %s\n", error->message);
- g_error_free(error);
- return -1;
- }
+ displaymenu();
+ app->loop = g_main_loop_new(NULL, TRUE);
+ app->timer = g_timer_new();
+ g_main_loop_run(app->loop);
- app->length = g_mapped_file_get_length (app->file);
- app->data = (guint8 *) g_mapped_file_get_contents (app->file);
- app->offset = 0;
-*/
- //g_print("len %d, offset %d", app->length, (int)app->offset);
- //g_main_loop_run(app->loop);
+ ops.data = app;
- displaymenu();
-
- ops.data = app;
-
- return appcore_efl_main(PACKAGE, &argc, &argv, &ops);
+ return appcore_efl_main(PACKAGE, &argc, &argv, &ops);
}
void mc_hex_dump(char *desc, void *addr, int len)
{
- int i;
- unsigned char buff[17];
- unsigned char *pc = (unsigned char *)addr;
+ int i;
+ unsigned char buff[17];
+ unsigned char *pc = (unsigned char *)addr;
- if (desc != NULL)
- printf("%s:\n", desc);
+ if (desc != NULL)
+ g_print("%s:\n", desc);
- for (i = 0; i < len; i++) {
+ for (i = 0; i < len; i++) {
- if ((i % 16) == 0) {
- if (i != 0)
- printf(" %s\n", buff);
+ if ((i % 16) == 0) {
+ if (i != 0)
+ g_print(" %s\n", buff);
- printf(" %04x ", i);
- }
+ g_print(" %04x ", i);
+ }
- printf(" %02x", pc[i]);
+ g_print(" %02x", pc[i]);
- if ((pc[i] < 0x20) || (pc[i] > 0x7e))
- buff[i % 16] = '.';
- else
- buff[i % 16] = pc[i];
- buff[(i % 16) + 1] = '\0';
- }
+ if ((pc[i] < 0x20) || (pc[i] > 0x7e))
+ buff[i % 16] = '.';
+ else
+ buff[i % 16] = pc[i];
+ buff[(i % 16) + 1] = '\0';
+ }
- while ((i % 16) != 0) {
- printf(" ");
- i++;
- }
- printf(" %s\n", buff);
+ while ((i % 16) != 0) {
+ g_print(" ");
+ i++;
+ }
+ g_print(" %s\n", buff);
}
-
static void decoder_output_dump(App *app, media_packet_h pkt)
{
- unsigned char *temp;
- int i = 0;
- int stride_width, stride_height;
- char filename[100]={0};
- FILE *fp = NULL;
- int ret =0;
-
- sprintf(filename, "/tmp/dec_output_dump_%d_%d.yuv", app->width, app->height);
- fp = fopen(filename, "ab");
-
- media_packet_get_video_plane_data_ptr(pkt, 0, &temp);
- media_packet_get_video_stride_width(pkt, 0, &stride_width);
- media_packet_get_video_stride_height(pkt, 0, &stride_height);
-
- for (i = 0; i < app->height; i++) {
- ret = fwrite(temp, app->width, 1, fp);
- temp += stride_width;
- }
-
- if (app->hardware == TRUE) {
- media_packet_get_video_plane_data_ptr(pkt, 1, &temp);
- media_packet_get_video_stride_width(pkt, 1, &stride_width);
- for (i = 0; i < app->height/2; i++) {
- ret = fwrite(temp, app->width, 1, fp);
- temp += stride_width;
- }
- } else {
- media_packet_get_video_plane_data_ptr(pkt, 1, &temp);
- media_packet_get_video_stride_width(pkt, 1, &stride_width);
- for (i = 0; i < app->height/2; i++) {
- ret = fwrite(temp, app->width/2, 1, fp);
- temp += stride_width;
- }
-
- media_packet_get_video_plane_data_ptr(pkt, 2, &temp);
- media_packet_get_video_stride_width(pkt, 2, &stride_width);
- for (i = 0; i < app->height/2; i++) {
- ret = fwrite(temp, app->width/2, 1, fp);
- temp += stride_width;
- }
- }
-
- g_print("codec dec output dumped!!%d\n", ret);
- fclose(fp);
+ void *temp;
+ int i = 0;
+ int stride_width, stride_height;
+ gchar filename[100] = {0};
+ FILE *fp = NULL;
+ int ret = 0;
+
+ g_snprintf(filename, MAX_STRING_LEN, "/tmp/dec_output_dump_%d_%d.yuv", app->width, app->height);
+ fp = fopen(filename, "ab");
+
+ media_packet_get_video_plane_data_ptr(pkt, 0, &temp);
+ media_packet_get_video_stride_width(pkt, 0, &stride_width);
+ media_packet_get_video_stride_height(pkt, 0, &stride_height);
+ g_print("stride : %d, %d\n", stride_width, stride_height);
+
+ for (i = 0; i < app->height; i++) {
+ ret = fwrite(temp, app->width, 1, fp);
+ temp += stride_width;
+ }
+
+ if (app->hardware == TRUE) {
+ media_packet_get_video_plane_data_ptr(pkt, 1, &temp);
+ media_packet_get_video_stride_width(pkt, 1, &stride_width);
+ for (i = 0; i < app->height/2; i++) {
+ ret = fwrite(temp, app->width, 1, fp);
+ temp += stride_width;
+ }
+ } else {
+ media_packet_get_video_plane_data_ptr(pkt, 1, &temp);
+ media_packet_get_video_stride_width(pkt, 1, &stride_width);
+ for (i = 0; i < app->height/2; i++) {
+ ret = fwrite(temp, app->width/2, 1, fp);
+ temp += stride_width;
+ }
+
+ media_packet_get_video_plane_data_ptr(pkt, 2, &temp);
+ media_packet_get_video_stride_width(pkt, 2, &stride_width);
+ for (i = 0; i < app->height/2; i++) {
+ ret = fwrite(temp, app->width/2, 1, fp);
+ temp += stride_width;
+ }
+ }
+
+ g_print("codec dec output dumped!!%d\n", ret);
+ fclose(fp);
+
+}
+
+/**
+ * Add ADTS header at the beginning of each and every AAC packet.
+ * This is needed as MediaCodec encoder generates a packet of raw AAC data.
+ * Note the packetLen must count in the ADTS header itself.
+ **/
+void add_adts_header_for_aacenc(App *app, char *buffer, int packetLen)
+{
+ int profile = 2; /* AAC LC (0x01) */
+ int freqIdx = 3; /* 48KHz (0x03) */
+ int chanCfg = 2; /* CPE (0x02) */
+
+ if (app->samplerate == 96000) freqIdx = 0;
+ else if (app->samplerate == 88200) freqIdx = 1;
+ else if (app->samplerate == 64000) freqIdx = 2;
+ else if (app->samplerate == 48000) freqIdx = 3;
+ else if (app->samplerate == 44100) freqIdx = 4;
+ else if (app->samplerate == 32000) freqIdx = 5;
+ else if (app->samplerate == 24000) freqIdx = 6;
+ else if (app->samplerate == 22050) freqIdx = 7;
+ else if (app->samplerate == 16000) freqIdx = 8;
+ else if (app->samplerate == 12000) freqIdx = 9;
+ else if (app->samplerate == 11025) freqIdx = 10;
+ else if (app->samplerate == 8000) freqIdx = 11;
+
+ if ((app->channel == 1) || (app->channel == 2))
+ chanCfg = app->channel;
+
+ /* fill in ADTS data */
+ buffer[0] = (char)0xFF;
+ buffer[1] = (char)0xF1;
+ buffer[2] = (char)(((profile-1)<<6) + (freqIdx<<2) +(chanCfg>>2));
+ buffer[3] = (char)(((chanCfg&3)<<6) + (packetLen>>11));
+ buffer[4] = (char)((packetLen&0x7FF) >> 3);
+ buffer[5] = (char)(((packetLen&7)<<5) + 0x1F);
+ buffer[6] = (char)0xFC;
+}
+
+static void output_dump(App *app, media_packet_h pkt)
+{
+ void *temp;
+ uint64_t buf_size;
+ gchar filename[100] = {0};
+ FILE *fp = NULL;
+ int ret = 0;
+ char adts[100] = {0, };
+
+ g_snprintf(filename, MAX_STRING_LEN, "/tmp/dec_output_dump_%d.out", app->type);
+ fp = fopen(filename, "ab");
+
+ media_packet_get_buffer_data_ptr(pkt, &temp);
+ media_packet_get_buffer_size(pkt, &buf_size);
+ g_print("output data : %p, size %d\n", temp, (int)buf_size);
+
+ if (app->is_encoder && buf_size > 0 && app->codecid == MEDIACODEC_AAC_LC) {
+ add_adts_header_for_aacenc(app, adts, (buf_size + ADTS_HEADER_SIZE));
+ fwrite(&adts, 1, ADTS_HEADER_SIZE, fp);
+ g_print("adts appended\n");
+ } else if (app->is_encoder && buf_size > 0 && app->codecid == MEDIACODEC_AMR_NB && write_amr_header == 1) {
+ /* This is used only AMR encoder case for adding AMR masic header in only first frame */
+ g_print("%s - AMR_header write in first frame\n", __func__);
+ fwrite(&AMR_header[0], 1, sizeof(AMR_header) - 1, fp); /* AMR-NB magic number */
+ write_amr_header = 0;
+ }
+
+ fwrite(temp, (int)buf_size, 1, fp);
+
+ g_print("codec dec output dumped!!%d\n", ret);
+ fclose(fp);
}
+const char* codec_type_to_string(mediacodec_codec_type_e media_codec_id)
+{
+ guint media_codec_id_u = (guint)media_codec_id;
+
+ switch (media_codec_id_u) {
+ case MEDIACODEC_L16:
+ return "L16";
+ case MEDIACODEC_ALAW:
+ return "ALAW";
+ case MEDIACODEC_ULAW:
+ return "ULAW";
+ case MEDIACODEC_AMR_NB:
+ return "AMR_NB";
+ case MEDIACODEC_AMR_WB:
+ return "AMR_WB";
+ case MEDIACODEC_G729:
+ return "G729";
+ case MEDIACODEC_AAC_LC:
+ return "AAC_LC";
+ case MEDIACODEC_AAC_HE:
+ return "AAC_HE";
+ case MEDIACODEC_AAC_HE_PS:
+ return "AAC_HE_PS";
+ case MEDIACODEC_MP3:
+ return "MP3";
+ case MEDIACODEC_VORBIS:
+ return "VORBIS";
+ case MEDIACODEC_FLAC:
+ return "FLAC";
+ case MEDIACODEC_WMAV1:
+ return "WMAV1";
+ case MEDIACODEC_WMAV2:
+ return "WMAV2";
+ case MEDIACODEC_WMAPRO:
+ return "WMAPRO";
+ case MEDIACODEC_WMALSL:
+ return "WMALSL";
+ case MEDIACODEC_H261:
+ return "H261";
+ case MEDIACODEC_H263:
+ return "H263";
+ case MEDIACODEC_H264:
+ return "H264";
+ case MEDIACODEC_MJPEG:
+ return "MJPEG";
+ case MEDIACODEC_MPEG1:
+ return "MPEG1";
+ case MEDIACODEC_MPEG2:
+ return "MPEG2";
+ case MEDIACODEC_MPEG4:
+ return "MPEG4";
+ case MEDIACODEC_HEVC:
+ return "HEVC";
+ case MEDIACODEC_VP8:
+ return "VP8";
+ case MEDIACODEC_VP9:
+ return "VP9";
+ case MEDIACODEC_VC1:
+ return "VC1";
+ default:
+ return "NONE";
+ }
+}
+