#include <tizen.h>
#include <stdint.h>
#include <media_packet.h>
+#include <media_packet_pool.h>
#ifdef __cplusplus
extern "C" {
*/
int mediacodec_get_supported_type(mediacodec_h mediacodec, mediacodec_codec_type_e codec_type, bool encoder, int *support_type);
+/**
+ * @brief Gets the media packet pool allocated for recycling media packets.
+ * @details The user can get the pool allocated with the number of packets are required to be used in codecs.\n
+ * It is recomended to use media packet pool for better stability and performance.
+ * @since_tizen 3.0
+ * @remarks The @a pool should be released using media_packet_pool_deallocate() and destroyed using media_packet_pool_destroy().
+ * @param[in] mediacodec The mediacodec handle
+ * @param[out] pool The allocated pool handle
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #MEDIACODEC_ERROR_NONE Successful
+ * @retval #MEDIACODEC_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIACODEC_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #MEDIACODEC_ERROR_INVALID_OPERATION The user calls mediacodec_get_packet_pool() before calling mediacodec_prepare().
+ * @pre mediacodec_get_packet_pool() should be called after calling mediacodec_prepare().
+ * @post If the pool is used, media_packet_pool_deallocate() and media_packet_pool_destroy() should be called.
+ * @see media_packet_pool_acquire_packet()
+ * @see media_packet_pool_release_packet()
+ * @see media_packet_pool_deallocate()
+ * @see media_packet_pool_destroy()
+ */
+int mediacodec_get_packet_pool(mediacodec_h mediacodec, media_packet_pool_h *pool);
/**
* @}
*/
typedef enum
{
- MC_ERROR_NONE = 0,
- MC_ERROR = -1, /**< codec happens error */
- MC_MEMORY_ERROR = -2, /**< codec memory is not enough */
- MC_PARAM_ERROR = -3, /**< codec parameter is error */
- MC_INVALID_ARG = -4, /** < codec has invalid arguments */
- MC_PERMISSION_DENIED = -5,
- MC_INVALID_STATUS = -6, /**< codec works at invalid status */
- MC_NOT_SUPPORTED = -7, /**< codec can't support this specific video format */
- MC_INVALID_IN_BUF = -8,
- MC_INVALID_OUT_BUF = -9,
- MC_INTERNAL_ERROR = -10,
- MC_HW_ERROR = -11, /**< codec happens hardware error */
- MC_NOT_INITIALIZED = -12,
- MC_INVALID_STREAM = -13,
- MC_CODEC_NOT_FOUND = -14,
- MC_ERROR_DECODE = -15,
- MC_OUTPUT_BUFFER_EMPTY = -16,
- MC_OUTPUT_BUFFER_OVERFLOW = -17, /**< codec output buffer is overflow */
- MC_MEMORY_ALLOCED = -18, /**< codec has got memory and can decode one frame */
- MC_COURRPTED_INI = -19,
+ MC_ERROR_NONE = 0,
+ MC_ERROR = -1, /**< codec happens error */
+ MC_MEMORY_ERROR = -2, /**< codec memory is not enough */
+ MC_PARAM_ERROR = -3, /**< codec parameter is error */
+ MC_INVALID_ARG = -4, /** < codec has invalid arguments */
+ MC_PERMISSION_DENIED = -5,
+ MC_INVALID_STATUS = -6, /**< codec works at invalid status */
+ MC_NOT_SUPPORTED = -7, /**< codec can't support this specific video format */
+ MC_INVALID_IN_BUF = -8,
+ MC_INVALID_OUT_BUF = -9,
+ MC_INTERNAL_ERROR = -10,
+ MC_HW_ERROR = -11, /**< codec happens hardware error */
+ MC_NOT_INITIALIZED = -12,
+ MC_INVALID_STREAM = -13,
+ MC_CODEC_NOT_FOUND = -14,
+ MC_ERROR_DECODE = -15,
+ MC_OUTPUT_BUFFER_EMPTY = -16,
+ MC_OUTPUT_BUFFER_OVERFLOW = -17, /**< codec output buffer is overflow */
+ MC_MEMORY_ALLOCED = -18, /**< codec has got memory and can decode one frame */
+ MC_COURRPTED_INI = -19,
+ MC_OUT_OF_MEMORY = -20, /**< when memory is not allocated */
} mc_ret_e;
/*---------------------------------------------------------------------------
int mc_flush_buffers(MMHandleType mediacodec);
int mc_get_supported_type(MMHandleType mediacodec, mediacodec_codec_type_e codec_type, bool encoder, int *support_type);
+int mc_get_packet_pool(MMHandleType mediacodec, media_packet_pool_h *pool);
+
int mc_set_empty_buffer_cb(MMHandleType mediacodec, mediacodec_input_buffer_used_cb callback, void* user_data);
int mc_unset_empty_buffer_cb(MMHandleType mediacodec);
int mc_unset_buffer_status_cb(MMHandleType mediacodec);
int mc_set_supported_codec_cb(MMHandleType mediacodec, mediacodec_supported_codec_cb callback, void* user_data);
int _mediacodec_foreach_supported_codec(MMHandleType mediacodec, mediacodec_supported_codec_cb callback, void* user_data);
+
#ifdef __cplusplus
}
#endif
#define SCMN_IMGB_MAX_PLANE 4
#define TBM_API_CHANGE
+#define DEFAULT_POOL_SIZE 20
/* gst port layer */
typedef struct _mc_gst_port_t mc_gst_port_t;
int __mc_adec_vorbis_caps(mc_gst_core_t *core, GstCaps **caps, GstMCBuffer* buff, gboolean codec_config);
int __mc_adec_flac_caps(mc_gst_core_t *core, GstCaps **caps, GstMCBuffer* buff, gboolean codec_config);
int __mc_adec_wma_caps(mc_gst_core_t *core, GstCaps **caps, GstMCBuffer* buff, gboolean codec_config);
-bool _mc_is_voss (unsigned char *p, int size, int *codec_size);
-bool _mc_is_ivop (unsigned char *p, int size, int pos);
-bool _mc_is_vop (unsigned char *p, int size, int pos);
-
void _mc_create_codec_map_from_ini(mc_handle_t *mc_handle, mc_codec_spec_t *spec_emul);
void _mc_create_decoder_map_from_ini(mc_handle_t *mc_handle);
mc_ret_e mc_gst_flush_buffers(mc_handle_t *mc_handle);
+mc_ret_e mc_gst_get_packet_pool(mc_handle_t *mc_handle, media_packet_pool_h *pkt_pool);
+
#ifdef __cplusplus
}
#endif
ret = MEDIACODEC_ERROR_BUFFER_NOT_AVAILABLE;
msg = "MEDIACODEC_ERROR_BUFFER_NOT_AVAILABLE";
break;
+ case MC_OUT_OF_MEMORY:
+ ret = MEDIACODEC_ERROR_OUT_OF_MEMORY;
+ msg = "MEDIACODEC_ERROR_OUT_OF_MEMORY";
+ break;
default:
ret = MEDIACODEC_ERROR_INTERNAL;
msg = "MEDIACODEC_ERROR_INTERNAL";
}
+int mediacodec_get_packet_pool(mediacodec_h mediacodec,media_packet_pool_h *pkt_pool)
+{
+ MEDIACODEC_INSTANCE_CHECK(mediacodec);
+ mediacodec_s *handle = (mediacodec_s *)mediacodec;
+ MEDIACODEC_STATE_CHECK(handle, MEDIACODEC_STATE_READY);
+ int ret = mc_get_packet_pool(handle->mc_handle,pkt_pool);
+
+ if (ret != MEDIACODEC_ERROR_NONE)
+ return MEDIACODEC_ERROR_INVALID_OPERATION;
+ else
+ return MEDIACODEC_ERROR_NONE;
+}
+
static gboolean __mediacodec_empty_buffer_cb(media_packet_h pkt, void *user_data)
{
if (user_data == NULL || pkt == NULL)
return ret;
}
+int mc_get_packet_pool(MMHandleType mediacodec, media_packet_pool_h *pool)
+{
+ int ret = MC_ERROR_NONE;
+ mc_handle_t *mc_handle = (mc_handle_t *)mediacodec;
+
+ if (!mc_handle) {
+ LOGE("fail invaild param\n");
+ return MC_INVALID_ARG;
+ }
+
+ /* setting core details */
+ switch (mc_handle->port_type) {
+ case MEDIACODEC_PORT_TYPE_GENERAL:
+ break;
+
+ case MEDIACODEC_PORT_TYPE_OMX:
+ break;
+
+ case MEDIACODEC_PORT_TYPE_GST:
+ ret = mc_gst_get_packet_pool(mc_handle, pool);
+ break;
+
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+
+
static void _mc_send_eos_signal(mc_gst_core_t *core);
static void _mc_wait_for_eos(mc_gst_core_t *core);
+static int _mediacodec_get_mime(mc_gst_core_t *core);
+
/* video vtable */
int(*vdec_vtable[])() = {&__mc_fill_inbuf_with_packet, &__mc_fill_vdec_packet_with_outbuf, &__mc_vdec_caps};
int(*venc_vtable[])() = {&__mc_fill_inbuf_with_packet, &__mc_fill_venc_packet_with_outbuf, &__mc_venc_caps};
}
}
+int _mediacodec_get_mime(mc_gst_core_t *core)
+{
+ media_format_mimetype_e mime;
+
+ switch (core->codec_id) {
+ case MEDIACODEC_H264:
+ if (core->encoder)
+ mime = (core->is_hw) ? MEDIA_FORMAT_NV12 : MEDIA_FORMAT_I420;
+ 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_AAC:
+ if (core->encoder)
+ mime = MEDIA_FORMAT_PCM;
+ else
+ mime = MEDIA_FORMAT_AAC;
+
+ break;
+ case MEDIACODEC_AAC_HE:
+ if (core->encoder)
+ mime = MEDIA_FORMAT_PCM;
+ 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;
+ default:
+ LOGE("NOT SUPPORTED!!!!");
+ break;
+ }
+ return mime;
+}
+
+mc_ret_e mc_gst_get_packet_pool(mc_handle_t *mc_handle, media_packet_pool_h *pkt_pool)
+{
+ int curr_size;
+ int max_size, min_size;
+ media_format_mimetype_e mime_format;
+ media_format_h *fmt_handle = NULL;
+ mc_gst_core_t *core = NULL;
+
+ if (!mc_handle)
+ return MC_PARAM_ERROR;
+
+ core = (mc_gst_core_t *)mc_handle->core;
+
+ int ret = media_packet_pool_create(pkt_pool);
+
+ if (ret != MEDIA_PACKET_ERROR_NONE) {
+ LOGE("media_packet_pool_create failed");
+ return MC_ERROR;
+ }
+
+ if (media_format_create(&fmt_handle) != MEDIA_FORMAT_ERROR_NONE) {
+ LOGE("media format create failed");
+ return MC_ERROR;
+ }
+
+ mime_format = _mediacodec_get_mime(core);
+
+ if (core->video) {
+ if (core->encoder) {
+ media_format_set_video_mime(fmt_handle, mime_format);
+ media_format_set_video_width(fmt_handle, mc_handle->info.encoder.width);
+ media_format_set_video_height(fmt_handle, mc_handle->info.encoder.height);
+ media_format_set_video_avg_bps(fmt_handle, mc_handle->info.encoder.bitrate);
+ } else {
+ media_format_set_video_mime(fmt_handle, mime_format);
+ media_format_set_video_width(fmt_handle, mc_handle->info.decoder.width);
+ media_format_set_video_height(fmt_handle, mc_handle->info.decoder.height);
+ }
+
+ } else {
+ if (core->encoder) {
+ media_format_set_audio_mime(fmt_handle, mime_format);
+ media_format_set_audio_channel(fmt_handle, mc_handle->info.encoder.channel);
+ media_format_set_audio_samplerate(fmt_handle, mc_handle->info.encoder.samplerate);
+ media_format_set_audio_bit(fmt_handle, mc_handle->info.encoder.bit);
+ } else {
+ media_format_set_audio_mime(fmt_handle, mime_format);
+ media_format_set_audio_channel(fmt_handle, mc_handle->info.decoder.channel);
+ media_format_set_audio_samplerate(fmt_handle, mc_handle->info.decoder.samplerate);
+ media_format_set_audio_bit(fmt_handle, mc_handle->info.decoder.bit);
+ }
+ }
+
+ ret = media_packet_pool_set_media_format(*pkt_pool, fmt_handle);
+ if (ret != MEDIA_PACKET_ERROR_NONE) {
+ LOGE("media_packet_pool_set_media_format failed");
+ return MC_ERROR;
+ }
+
+ /* will use default size temporarily */
+ max_size = DEFAULT_POOL_SIZE;
+
+ min_size = max_size;
+ ret = media_packet_pool_set_size(*pkt_pool, min_size, max_size);
+ if (ret != MEDIA_PACKET_ERROR_NONE) {
+ LOGE("media_packet_pool_set_size failed");
+ return MC_ERROR;
+ }
+
+ media_packet_pool_get_size(*pkt_pool, &min_size, &max_size, &curr_size);
+ LOGD("curr_size is %d min_size is %d and max_size is %d \n", curr_size, min_size, max_size);
+
+ ret = media_packet_pool_allocate(*pkt_pool);
+ if (ret != MEDIA_PACKET_ERROR_NONE) {
+ LOGE("media_packet_pool_allocate failed");
+ return MC_OUT_OF_MEMORY;
+ }
+ return MC_ERROR_NONE;
+}