Add new internal API to enable extra video convert element
[platform/core/api/mediacodec.git] / src / media_codec_internal.c
1 #include <dlog.h>
2 #include <media_codec.h>
3 #include <media_codec_port.h>
4 #include <media_codec_port_gst.h>
5 #include <media_codec_ini.h>
6 #include <media_codec_spec_emul.h>
7 #include <media_codec_internal.h>
8
9 mc_codec_spec_t spec_emul[MEDIA_CODEC_MAX_CODEC_TYPE];
10 mc_ini_t mc_ini;
11
12 int __convert_error_code_internal(int code, char *func_name)
13 {
14         int ret = MEDIACODEC_ERROR_INVALID_OPERATION;
15         char *msg = "MEDIACOODEC_INVALID_OPERATION";
16
17         switch (code) {
18         case MC_ERROR_NONE:
19                 ret = MEDIACODEC_ERROR_NONE;
20                 msg = "MEDIACODEC_ERROR_NONE";
21                 break;
22         case MC_PARAM_ERROR:
23         case MC_INVALID_ARG:
24                 ret = MEDIACODEC_ERROR_INVALID_PARAMETER;
25                 msg = "MEDIACODEC_ERROR_INVALID_PARAMETER";
26                 break;
27         case MC_PERMISSION_DENIED:
28                 ret = MEDIACODEC_ERROR_PERMISSION_DENIED;
29                 msg = "MEDIACODEC_ERROR_PERMISSION_DENIED";
30                 break;
31         case MC_INVALID_STATUS:
32                 ret = MEDIACODEC_ERROR_INVALID_STATE;
33                 msg = "MEDIACODEC_ERROR_INVALID_STATE";
34                 break;
35         case MC_NOT_SUPPORTED:
36                 ret = MEDIACODEC_ERROR_NOT_SUPPORTED_ON_DEVICE;
37                 msg = "MEDIACODEC_ERROR_NOT_SUPPORTED_ON_DEVICE";
38                 break;
39         case MC_ERROR:
40         case MC_INTERNAL_ERROR:
41         case MC_HW_ERROR:
42                 ret = MEDIACODEC_ERROR_INVALID_OPERATION;
43                 msg = "MEDIACODEC_ERROR_INVALID_OPERATION";
44                 break;
45         case MC_INVALID_STREAM:
46                 ret = MEDIACODEC_ERROR_INVALID_STREAM;
47                 msg = "MEDIACODEC_ERROR_INVALID_STREAM";
48                 break;
49         case MC_CODEC_NOT_FOUND:
50                 ret = MEDIACODEC_ERROR_CODEC_NOT_FOUND;
51                 msg = "MEDIACODEC_ERROR_CODEC_NOT_FOUND";
52                 break;
53         case MC_ERROR_DECODE:
54                 ret = MEDIACODEC_ERROR_DECODE;
55                 msg = "MEDIACODEC_ERROR_DECODE";
56                 break;
57         case MC_INVALID_IN_BUF:
58                 ret = MEDIACODEC_ERROR_INVALID_INBUFFER;
59                 msg = "MEDIACODEC_ERROR_INVALID_INBUFFER";
60                 break;
61         case MC_INVALID_OUT_BUF:
62                 ret = MEDIACODEC_ERROR_INVALID_OUTBUFFER;
63                 msg = "MEDIACODEC_ERROR_INVALID_OUTBUFFER";
64                 break;
65         case MC_NOT_INITIALIZED:
66                 ret = MEDIACODEC_ERROR_NOT_INITIALIZED;
67                 msg = "MEDIACODEC_ERROR_NOT_INITIALIZED";
68                 break;
69         case MC_OUTPUT_BUFFER_EMPTY:
70         case MC_OUTPUT_BUFFER_OVERFLOW:
71                 ret = MEDIACODEC_ERROR_BUFFER_NOT_AVAILABLE;
72                 msg = "MEDIACODEC_ERROR_BUFFER_NOT_AVAILABLE";
73                 break;
74         case MC_OUT_OF_MEMORY:
75                 ret = MEDIACODEC_ERROR_OUT_OF_MEMORY;
76                 msg = "MEDIACODEC_ERROR_OUT_OF_MEMORY";
77                 break;
78         default:
79                 ret = MEDIACODEC_ERROR_INTERNAL;
80                 msg = "MEDIACODEC_ERROR_INTERNAL";
81                 break;
82         }
83         LOGD("[%s] %s(0x%08x) : core fw error(0x%x)", func_name, msg, ret, code);
84         return ret;
85 }
86
87 int mediacodec_foreach_supported_codec_static(mediacodec_supported_codec_cb callback, void *user_data)
88 {
89         int ret;
90
91         if (!mc_ini.loaded) {
92                 ret = mc_ini_load(&mc_ini);
93                 if (ret != MC_ERROR_NONE)
94                         goto ERROR;
95
96                 mc_ini.loaded = TRUE;
97         }
98
99         _mc_create_codec_map_from_ini_static(&mc_ini, spec_emul);
100
101         LOGD("set supported_codec_cb(%p)", callback);
102         ret = _mediacodec_foreach_supported_codec(callback, user_data);
103
104         if (ret != MEDIACODEC_ERROR_NONE)
105                 return __convert_error_code_internal(ret, (char *)__FUNCTION__);
106         else
107                 return MEDIACODEC_ERROR_NONE;
108
109 ERROR:
110         return MEDIACODEC_ERROR_INVALID_PARAMETER;
111 }
112
113 int mediacodec_enable_extra_video_converter(mediacodec_h mediacodec, gboolean enable, const char *converter_name, int crop_x, int crop_y, int crop_w, int crop_h)
114 {
115         MEDIACODEC_INSTANCE_CHECK(mediacodec);
116         mediacodec_s *handle = (mediacodec_s *)mediacodec;
117         MEDIACODEC_STATE_CHECK(handle, MEDIACODEC_STATE_IDLE);
118
119         int ret = mc_enable_extra_video_converter(handle->mc_handle, enable, converter_name, crop_x, crop_y, crop_w, crop_h);
120
121         if (ret != MEDIACODEC_ERROR_NONE)
122                 return __convert_error_code_internal(ret, (char *)__FUNCTION__);
123         else
124                 return MEDIACODEC_ERROR_NONE;
125 }