static int(*vdec_mpeg4_sw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* S/W MPEG4 Decoder Vtable */
&__mc_fill_vdec_packet_with_output_buffer};
-static int(*vdec_h263_sw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* S/W MPEG4 Decoder Vtable */
+static int(*vdec_h263_sw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* S/W H.263 Decoder Vtable */
+ &__mc_fill_vdec_packet_with_output_buffer};
+
+static int(*vdec_mjpeg_sw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* S/W MJPEG Decoder Vtable */
&__mc_fill_vdec_packet_with_output_buffer};
static int(*vdec_h264_hw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* H/W H.264 Decoder Vtable */
static int(*vdec_mpeg4_hw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* H/W MPEG4 Decoder Vtable */
&__mc_fill_vdec_packet_with_output_buffer};
-static int(*vdec_h263_hw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* H/W MPEG4 Decoder Vtable */
+static int(*vdec_h263_hw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* H/W H.263 Decoder Vtable */
+ &__mc_fill_vdec_packet_with_output_buffer};
+
+static int(*vdec_mjpeg_hw_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* H/W MJPEG Decoder Vtable */
&__mc_fill_vdec_packet_with_output_buffer};
static int(*venc_mpeg4_sw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* S/W MPEG4 Encoder Vtable */
&__mc_fill_venc_packet_with_output_buffer};
-static int(*venc_h263_sw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* S/W MPEG4 Encoder Vtable */
+static int(*venc_h263_sw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* S/W H.263 Encoder Vtable */
+ &__mc_fill_venc_packet_with_output_buffer};
+
+static int(*venc_mjpeg_sw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* S/W MJPEG Encoder Vtable */
&__mc_fill_venc_packet_with_output_buffer};
static int(*venc_h264_hw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* H/W H.264 Encoder Vtable */
static int(*venc_mpeg4_hw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* H/W MPEG4 Encoder Vtable */
&__mc_fill_venc_packet_with_output_buffer};
-static int(*venc_h263_hw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* H/W MPEG4 Encoder Vtable */
+static int(*venc_h263_hw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* H/W H.263 Encoder Vtable */
+ &__mc_fill_venc_packet_with_output_buffer};
+
+static int(*venc_mjpeg_hw_vtable[])() = {&__mc_fill_input_buffer_with_venc_packet, /* H/W MJPEG Encoder Vtable */
&__mc_fill_venc_packet_with_output_buffer};
__attribute__((unused))
static int __mc_fill_venc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer)
{
gint ret = MC_ERROR_NONE;
- bool codec_config = FALSE;
- bool sync_flag = FALSE;
- bool slice = FALSE;
+ bool codec_config = false;
+ bool sync_flag = false;
+ bool slice = false;
gint mem_size = 0;
gchar *ext_mem = NULL;
gint data_size = 0;
switch (core->ports[out_port_index]->port_def.coding_type) {
case MEDIA_FORMAT_H264_SP:
+ /* fall through */
case MEDIA_FORMAT_H264_MP:
+ /* fall through */
case MEDIA_FORMAT_H264_HP:
data_size = _mc_check_h264_bytestream((unsigned char *)data, size, 1, &codec_config, &sync_flag, &slice);
-
if (data_size < 0) {
LOGE("No valid SPS/PPS ...");
return MC_INVALID_IN_BUF;
}
break;
+
case MEDIA_FORMAT_MPEG4_SP:
+ /* fall through */
case MEDIA_FORMAT_MPEG4_ASP:
_mc_check_mpeg4_out_bytestream((unsigned char *)data, size, &codec_config, &sync_flag);
break;
+
case MEDIA_FORMAT_H263:
+ /* fall through */
case MEDIA_FORMAT_H263P:
if (!_mc_check_h263_out_bytestream((unsigned char *)data, size, &sync_flag))
return MC_INVALID_IN_BUF;
break;
+
+ case MEDIA_FORMAT_MJPEG:
+ sync_flag = true;
+ if (!_mc_check_mjpeg_out_bytestream((unsigned char *)data, size))
+ return MC_INVALID_IN_BUF;
+ break;
+
default:
return MC_INVALID_IN_BUF;
}
+
LOGD("codec_config : %d, sync_flag : %d, slice : %d", codec_config, sync_flag, slice);
mem_size = GST_ROUND_UP_4(size);
g_free(ext_mem);
return MC_ERROR;
}
+
mcbuffer->packet = packet;
mcbuffer->ext_mem = ext_mem;
NULL);
}
break;
+
case MEDIACODEC_MPEG4:
if (core->encoder) {
gst_caps_set_simple(caps,
NULL);
}
break;
+
case MEDIACODEC_H264:
if (core->encoder) {
gst_caps_set_simple(caps,
"format", G_TYPE_STRING, port_def->info.video.format,
NULL);
g_object_set(GST_OBJECT(core->codec), "byte-stream", TRUE, NULL);
- LOGE("format : %s", port_def->info.video.format);
+ LOGI("format[%s]", port_def->info.video.format);
} else {
gst_caps_set_simple(caps,
"parsed", G_TYPE_BOOLEAN, TRUE, /* FIXME different from sw */
NULL);
}
break;
+
+ case MEDIACODEC_MJPEG:
+ if (core->encoder) {
+ gst_caps_set_simple(caps,
+ "format", G_TYPE_STRING, port_def->info.video.format,
+ NULL);
+ LOGI("format[%s]", port_def->info.video.format);
+ }
+ break;
+
default:
break;
}
else
core->vtable = adec_aac_vtable;
break;
+
case MEDIACODEC_AAC_HE:
+ /* fall through */
case MEDIACODEC_AAC_HE_PS:
if (encoder) {
LOGD("[MC_NOT_SUPPORTED] he-aac-v12 encoder is not supported yet!!!");
core->vtable = adec_aacv12_vtable;
}
break;
+
case MEDIACODEC_MP3:
if (encoder) {
LOGD("[MC_NOT_SUPPORTED] mp3 encoder is not supported yet!!!");
core->vtable = adec_mp3_vtable;
}
break;
+
case MEDIACODEC_AMR_NB:
LOGD("amrnb vtable");
if (encoder)
else
core->vtable = adec_amrnb_vtable;
break;
+
case MEDIACODEC_AMR_WB:
LOGD("amrwb vtable - Only support decoder");
if (encoder) {
core->vtable = adec_amrwb_vtable;
}
break;
+
case MEDIACODEC_VORBIS:
LOGD("vorbis vtable");
if (encoder)
else
core->vtable = adec_vorbis_vtable;
break;
+
case MEDIACODEC_FLAC:
LOGD("flac vtable");
if (encoder) {
core->vtable = adec_flac_vtable;
}
break;
+
case MEDIACODEC_OPUS:
LOGD("opus vtable");
if (encoder)
core->vtable = adec_vtable;
break;
case MEDIACODEC_WMAV1:
+ /* fall through */
case MEDIACODEC_WMAV2:
+ /* fall through */
case MEDIACODEC_WMAPRO:
+ /* fall through */
case MEDIACODEC_WMALSL:
LOGD("wma(V1 / V2 / LSL / PRO) vtable");
if (encoder) {
core->vtable = adec_wma_vtable;
}
break;
+
case MEDIACODEC_H263:
LOGD("h263 vtable");
if (encoder) {
core->vtable = vdec_h263_sw_vtable;
}
break;
+
case MEDIACODEC_MPEG4:
LOGD("mpeg4 vtable");
if (encoder)
else
core->vtable = is_hw ? vdec_mpeg4_hw_vtable : vdec_mpeg4_sw_vtable;
break;
+
case MEDIACODEC_H264:
LOGD("h264 vtable");
if (encoder) {
core->vtable = vdec_h264_sw_vtable;
}
break;
+
+ case MEDIACODEC_MJPEG:
+ LOGD("mjpeg vtable");
+ if (encoder) {
+ core->vtable = is_hw ? venc_mjpeg_hw_vtable : venc_mjpeg_sw_vtable;
+ } else {
+ if (is_hw)
+ core->vtable = vdec_mjpeg_hw_vtable;
+ else
+ core->vtable = vdec_mjpeg_sw_vtable;
+ }
+ break;
+
default:
break;
}
else
mime = MEDIA_FORMAT_H264_SP;
break;
+
case MEDIACODEC_MPEG4:
if (core->encoder)
mime = (core->is_hw) ? MEDIA_FORMAT_NV12 : MEDIA_FORMAT_I420;
else
mime = MEDIA_FORMAT_MPEG4_SP;
-
break;
+
case MEDIACODEC_H263:
if (core->encoder)
mime = (core->is_hw) ? MEDIA_FORMAT_NV12 : MEDIA_FORMAT_I420;
else
mime = MEDIA_FORMAT_H263P;
+ break;
+ case MEDIACODEC_MJPEG:
+ if (core->encoder)
+ mime = (core->is_hw) ? MEDIA_FORMAT_NV12 : MEDIA_FORMAT_I420;
+ else
+ mime = MEDIA_FORMAT_MJPEG;
break;
+
case MEDIACODEC_AAC:
if (core->encoder)
mime = MEDIA_FORMAT_PCM_F32LE; /*FIXME need to change PCM supported by chipset */
mime = MEDIA_FORMAT_AAC;
break;
+
case MEDIACODEC_AAC_HE:
if (core->encoder)
mime = MEDIA_FORMAT_PCM_F32LE; /* FIXME need to change PCM supported by chipset */
else
mime = MEDIA_FORMAT_AAC_HE;
-
break;
+
case MEDIACODEC_AAC_HE_PS:
break;
+
case MEDIACODEC_MP3:
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:
mime = MEDIA_FORMAT_AMR_NB;
break;
+
case MEDIACODEC_AMR_WB:
mime = MEDIA_FORMAT_AMR_WB;
break;
+
case MEDIACODEC_OPUS:
if (core->encoder)
mime = MEDIA_FORMAT_OPUS;
else
mime = MEDIA_FORMAT_PCM_S16LE;
break;
+
default:
LOGE("NOT SUPPORTED!!!! 0x%x ", core->codec_id);
break;
glong start;
glong finish;
glong process_time;
- gint frame_count;
+ gint frame_count_output;
+ gint frame_count_input;
gint codecid;
gint flag;
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:
+ /* fall through */
case NAL_SEI:
g_print ("nal_unit_type : IDR\n");
state |= MC_EXIST_IDR;
break;
+
case NAL_SLICE_NO_PARTITIONING:
+ /* fall through */
case NAL_SLICE_PART_A:
+ /* fall through */
case NAL_SLICE_PART_B:
+ /* fall through */
case NAL_SLICE_PART_C:
state |= MC_EXIST_SLICE;
break;
+
default:
g_print ("nal_unit_type : %x", nal_unit_type);
break;
*have_frame = TRUE;
}
+void mjpeg_extractor(App * app, guint8 **data, gint *size, gboolean * have_frame, gboolean *codec_data)
+{
+ size_t offset = 0;
+ size_t marker_len = 0;
+ size_t max = (size_t)(app->length - app->offset);
+ unsigned char marker[2] = {0, };
+ unsigned char num_comp = 0;
+ unsigned char *pMJPEG = app->data + app->offset;
+
+ if (app->offset == 0)
+ g_print("=== START(size:%d) ===\n", app->length);
+
+ if (pMJPEG[0] != 0xff || pMJPEG[1] != 0xd8) {
+ g_print("invalid SOI(StartOfImage,0xffd8) vs [0x%02x%02x]\n", pMJPEG[0], pMJPEG[1]);
+ *have_frame = FALSE;
+ return;
+ }
+
+ *data = pMJPEG;
+
+ /* set offset after SOI(StartOfImage) marker(2bytes) */
+ offset = 2;
+
+ while (offset < max) {
+ marker[0] = pMJPEG[offset++];
+ marker[1] = pMJPEG[offset++];
+
+ marker_len = (pMJPEG[offset] * 256) + pMJPEG[offset+1];
+
+ if (marker[0] == 0xff && marker[1] == 0xda) {
+ /* set offset after Ls(ScanHeaderLength) */
+ offset += 2;
+
+ g_print("Found SOS(StartOfScan, 0xffda): Ls(ScanHeaderLength) %4zu, ", marker_len);
+
+ /* Ns: Number of image components */
+ num_comp = pMJPEG[offset++];
+
+ g_print("Ns(Number of image components) %u\n", num_comp);
+
+ /* set offset after scan header: (Ls * Ns) + 1(Ss) + 1(Se) + 0.5(Ah) + 0.5(Al) */
+ offset += (marker_len * num_comp) + 3;
+
+ while (offset < max) {
+ if (pMJPEG[offset++] == 0xff && pMJPEG[offset++] == 0xd9) {
+ g_print("Found EOI(EndOfImage, 0xffd9): offset[%zu]\n", offset);
+ goto _DONE;
+ }
+ }
+ }
+
+ offset += marker_len;
+ }
+
+_DONE:
+ *size = offset;
+ app->offset += offset;
+ *have_frame = TRUE;
+}
+
/**
* Extract Input data for AMR-NB/WB decoder
* - AMR-NB : mime type ("audio/AMR") / 8Khz / 1 ch / 16 bits
app->offset += *size;
}
*/
-int _configure(App *app, int codecid, int flag, gboolean *hardware, media_format_mimetype_e *codec_mime)
+int _configure(App *app, int codecid, int flag, gboolean *hardware, media_format_mimetype_e *codec_mime)
{
- gboolean encoder;
media_format_mimetype_e mime = 0;
- encoder = GET_IS_ENCODER(flag) ? 1 : 0;
+
+ app->is_encoder = GET_IS_ENCODER(flag);
*hardware = GET_IS_HW(flag) ? 1 : 0;
- app->is_encoder = encoder;
switch (codecid) {
case MEDIACODEC_H264:
- if (encoder) {
+ if (app->is_encoder) {
extractor = yuv_extractor;
mime = *hardware ? MEDIA_FORMAT_NV12 : MEDIA_FORMAT_I420;
*codec_mime = MEDIA_FORMAT_H264_SP;
mime = MEDIA_FORMAT_H264_SP;
}
break;
+
case MEDIACODEC_MPEG4:
- if (encoder) {
+ if (app->is_encoder) {
extractor = yuv_extractor;
mime = *hardware ? MEDIA_FORMAT_NV12 : MEDIA_FORMAT_I420;
*codec_mime = MEDIA_FORMAT_MPEG4_SP;
mime = MEDIA_FORMAT_MPEG4_SP;
}
break;
+
case MEDIACODEC_H263:
- if (encoder) {
+ if (app->is_encoder) {
extractor = yuv_extractor;
mime = *hardware ? MEDIA_FORMAT_NV12 : MEDIA_FORMAT_I420;
*codec_mime = MEDIA_FORMAT_H263;
mime = MEDIA_FORMAT_H263;
}
break;
+
+ case MEDIACODEC_MJPEG:
+ if (app->is_encoder) {
+ extractor = yuv_extractor;
+ mime = *hardware ? MEDIA_FORMAT_NV12 : MEDIA_FORMAT_I420;
+ *codec_mime = MEDIA_FORMAT_MJPEG;
+ } else {
+ extractor = mjpeg_extractor;
+ mime = MEDIA_FORMAT_MJPEG;
+ }
+ break;
+
case MEDIACODEC_AAC:
- if (encoder) {
+ if (app->is_encoder) {
extractor = aacenc_extractor;
mime = MEDIA_FORMAT_PCM_F32LE; /* FIXME need to check according to verdor */
*codec_mime = MEDIA_FORMAT_AAC;
mime = MEDIA_FORMAT_AAC;
}
break;
+
case MEDIACODEC_AAC_HE:
- if (encoder) {
+ if (app->is_encoder) {
extractor = aacenc_extractor;
mime = MEDIA_FORMAT_PCM_F32LE; /* FIXME need to check according to verdor */
*codec_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) {
+ if (app->is_encoder) {
extractor = amrenc_extractor;
mime = MEDIA_FORMAT_PCM_F32LE; /* FIXME need to check according to verdor */
*codec_mime = MEDIA_FORMAT_AMR_NB;
mime = MEDIA_FORMAT_AMR_NB;
}
break;
+
case MEDIACODEC_AMR_WB:
- if (encoder) {
+ if (app->is_encoder) {
extractor = amrenc_extractor;
mime = MEDIA_FORMAT_PCM_F32LE; /* FIXME need to check according to verdor */
app->is_amr_nb = FALSE;
mime = MEDIA_FORMAT_AMR_WB;
}
break;
+
case MEDIACODEC_OPUS:
- if (encoder) {
+ if (app->is_encoder) {
extractor = opusenc_extractor;
mime = MEDIA_FORMAT_OPUS; /* FIXME need to check according to verdor */
*codec_mime = MEDIA_FORMAT_OPUS;
LOGE("NOT SUPPORTED!!!!");
break;
}
+
return mime;
}
}
}
+
mc_hex_dump("inbuf", tmp, 48);
ret = mediacodec_process_input(app->mc_handle[0], pkt, 1000);
gint stride_width;
if (app->offset == 0) {
- app->frame_count = 0;
+ app->frame_count_input = 0;
+ app->frame_count_output = 0;
app->start = clock();
}
g_print("----------read data------------\n");
extractor(app, &tmp, &read, &have_frame, &codec_config);
- if (app->offset >= app->length - 4) {
+ if (app->mime != MEDIA_FORMAT_MJPEG &&
+ (app->offset >= app->length - 4)) {
/* EOS */
- g_print("EOS\n");
+ g_print("EOS: frame count[%d]\n", app->frame_count_input);
app->finish = clock();
- g_print("Average FPS = %3.3f\n", ((double)app->frame_count*1000000/(app->finish - app->start)));
+ g_print("Average FPS = %3.3f\n", ((double)app->frame_count_output*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)
}
}
+
mc_hex_dump("inbuf", tmp, 48);
ret = mediacodec_process_input(app->mc_handle[0], pkt, 0);
if (ret != MEDIACODEC_ERROR_NONE)
return FALSE;
+ app->frame_count_input++;
pts += ES_DEFAULT_VIDEO_PTS_OFFSET;
}
+ g_print("[INPUT_BUFFER] frame count[%d]\n", app->frame_count_input);
+
+ if (app->mime == MEDIA_FORMAT_MJPEG &&
+ app->offset >= app->length) {
+ g_print("=== EOS: total input count[%d] ===\n", app->frame_count_input);
+ return FALSE;
+ }
+
return TRUE;
}
if (app->enable_dump)
output_dump(app, out_pkt);
- app->frame_count++;
+ app->frame_count_output++;
app->fbd++;
if (app->enable_dump)
decoder_output_dump(app, out_pkt);
- app->frame_count++;
+ app->frame_count_output++;
app->fbd++;
else
output_dump(app, out_pkt);
}
+
#ifdef TIZEN_FEATURE_INTEGRATION
if (app->enable_muxer) {
if (mediamuxer_write_sample(app->muxer, app->track, out_pkt) != MEDIAMUXER_ERROR_NONE)
g_print("write sample!!!\n");
}
#endif
- app->frame_count++;
- app->fbd++;
+ app->frame_count_output++;
+ app->fbd++;
g_mutex_unlock(&app->lock);
media_packet_unref(out_pkt);
- out_pkt = NULL;
- g_print("done\n");
+
+ g_print("[OUTPUT_BUFFER] done - frame count[%d]\n", app->frame_count_output);
return;
}
if (ret != MEDIACODEC_ERROR_NONE)
g_print("mediacodec_configure failed\n");
break;
+
case VIDEO_ENC:
media_format_set_video_mime(fmt, app->mime);
media_format_set_video_width(fmt, app->width);
g_print("mediacodec_configure failed\n");
media_format_unref(codec_format);
break;
+
case AUDIO_DEC:
media_format_set_audio_mime(fmt, app->mime);
media_format_set_audio_channel(fmt, app->channel);
if (ret != MEDIACODEC_ERROR_NONE)
g_print("mediacodec_configure failed\n");
break;
+
case AUDIO_ENC:
media_format_set_audio_mime(fmt, app->mime);
media_format_set_audio_channel(fmt, app->channel);
g_print("mediacodec_set_configure failed\n");
media_format_unref(codec_format);
break;
+
default:
g_print("invaild type\n");
break;
FILE *fp = NULL;
int ret = 0;
- g_snprintf(filename, MAX_STRING_LEN, "/tmp/dec_output_dump_%d_%d.yuv", app->width, app->height);
+ g_snprintf(filename, MAX_STRING_LEN, "/home/owner/media/dec_output_dump_%d_%d.yuv", app->width, app->height);
fp = fopen(filename, "ab");
media_packet_get_video_plane_data_ptr(pkt, 0, (void **)&temp);