4 * Copyright (c) 2000 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Hyuntae Kim <ht1211.kim@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
22 /*=======================================================================================
24 =======================================================================================*/
27 #include <sys/vfs.h> /* struct statfs */
29 #include "mm_streamrecorder_util.h"
34 #include "iniparser.h"
35 #include <glib/gstdio.h>
36 #include <gst/video/video-info.h>
38 /*-----------------------------------------------------------------------
39 | GLOBAL VARIABLE DEFINITIONS for internal |
40 -----------------------------------------------------------------------*/
42 /*-----------------------------------------------------------------------
43 | LOCAL VARIABLE DEFINITIONS for internal |
44 -----------------------------------------------------------------------*/
45 #define TIME_STRING_MAX_LEN 64
47 /*---------------------------------------------------------------------------
48 | LOCAL FUNCTION PROTOTYPES: |
49 ---------------------------------------------------------------------------*/
50 /* STATIC INTERNAL FUNCTION */
52 /* static gint skip_mdat(FILE *f); */
54 /*===========================================================================================
56 | FUNCTION DEFINITIONS |
57 ========================================================================================== */
58 /*---------------------------------------------------------------------------
59 | GLOBAL FUNCTION DEFINITIONS: |
60 ---------------------------------------------------------------------------*/
62 gint32 _mmstreamrecorder_double_to_fix(gdouble d_number)
64 return (gint32) (d_number * 65536.0);
67 int _mmstreamrecorder_get_freespace(const gchar *path, guint64 *free_space)
73 if (!g_file_test(path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) {
74 _mmstreamrec_dbg_log("File(%s) doesn't exist.", path);
78 if (-1 == statfs(path, &fs)) {
79 _mmstreamrec_dbg_log("Getting free space is failed.(%s)", path);
83 *free_space = (guint64) fs.f_bsize * fs.f_bavail;
87 int _mmstreamrecorder_get_file_size(const char *filename, guint64 * size)
91 if (stat(filename, &buf) != 0)
93 *size = (guint64) buf.st_size;
97 void _mmstreamrecorder_err_trace_write(char *str_filename, char *func_name, int line_num, char *fmt, ...)
101 char time_string[TIME_STRING_MAX_LEN] = { '\0', };
106 mmf_return_if_fail(str_filename);
108 current_time = time(NULL);
109 localtime_r(¤t_time, &new_time);
111 f = fopen(str_filename, "a");
113 _mmstreamrec_dbg_warn("Failed to open file.[%s]", str_filename);
117 asctime_r(&new_time, time_string);
118 fprintf(f, "[%.19s][%05d][%s]", time_string, line_num, func_name);
121 vfprintf(f, fmt, ap);
129 int _mmstreamrecorder_get_pixel_format(GstCaps *caps)
131 const GstStructure *structure;
132 const char *media_type = NULL;
133 MMPixelFormatType type = MM_PIXEL_FORMAT_INVALID;
134 unsigned int fourcc = 0;
135 GstVideoInfo media_info;
137 mmf_return_val_if_fail(caps != NULL, MM_PIXEL_FORMAT_INVALID);
139 structure = gst_caps_get_structure(caps, 0);
140 media_type = gst_structure_get_name(structure);
142 if (media_type == NULL) {
143 _mmstreamrec_dbg_log("failed to get media_type");
144 return MM_PIXEL_FORMAT_INVALID;
147 _mmstreamrec_dbg_log("media type [%s]", media_type);
149 if (!strcmp(media_type, "image/jpeg")) {
150 type = MM_PIXEL_FORMAT_ENCODED;
151 } else if (!strcmp(media_type, "video/x-raw")) {
152 gst_video_info_init(&media_info);
153 if (gst_video_info_from_caps(&media_info, caps)) {
154 fourcc = gst_video_format_to_fourcc(GST_VIDEO_INFO_FORMAT(&media_info));
155 type = _mmstreamrecorder_get_pixtype(fourcc);
157 _mmstreamrec_dbg_err("Getting media_info is failed");
160 _mmstreamrec_dbg_err("Not supported format. Format [%s]", media_type);
163 _mmstreamrec_dbg_log("Pixel Format Type [%d]", type);
165 gst_caps_unref(caps);
171 unsigned int _mmstreamrecorder_get_fourcc(int pixtype, int codectype, int use_zero_copy_format)
173 unsigned int fourcc = 0;
175 _mmstreamrec_dbg_log("pixtype(%d)", pixtype);
178 case MM_PIXEL_FORMAT_NV12:
179 if (use_zero_copy_format)
180 fourcc = GST_MAKE_FOURCC('S', 'N', '1', '2');
182 fourcc = GST_MAKE_FOURCC('N', 'V', '1', '2');
184 case MM_PIXEL_FORMAT_YUYV:
185 if (use_zero_copy_format)
186 fourcc = GST_MAKE_FOURCC('S', 'U', 'Y', 'V');
188 fourcc = GST_MAKE_FOURCC('Y', 'U', 'Y', '2');
190 case MM_PIXEL_FORMAT_UYVY:
191 if (use_zero_copy_format)
192 fourcc = GST_MAKE_FOURCC('S', 'Y', 'V', 'Y');
194 fourcc = GST_MAKE_FOURCC('U', 'Y', 'V', 'Y');
197 case MM_PIXEL_FORMAT_I420:
198 if (use_zero_copy_format)
199 fourcc = GST_MAKE_FOURCC('S', '4', '2', '0');
201 fourcc = GST_MAKE_FOURCC('I', '4', '2', '0');
203 case MM_PIXEL_FORMAT_YV12:
204 fourcc = GST_MAKE_FOURCC('Y', 'V', '1', '2');
206 case MM_PIXEL_FORMAT_422P:
207 fourcc = GST_MAKE_FOURCC('4', '2', '2', 'P');
209 case MM_PIXEL_FORMAT_RGB565:
210 fourcc = GST_MAKE_FOURCC('R', 'G', 'B', 'P');
212 case MM_PIXEL_FORMAT_RGB888:
213 fourcc = GST_MAKE_FOURCC('R', 'G', 'B', ' ');
215 case MM_PIXEL_FORMAT_ENCODED:
216 if (codectype == MM_IMAGE_CODEC_JPEG) {
217 fourcc = GST_MAKE_FOURCC('J', 'P', 'E', 'G');
218 } else if (codectype == MM_IMAGE_CODEC_JPEG_SRW) {
219 fourcc = GST_MAKE_FOURCC('J', 'P', 'E', 'G'); /*TODO: JPEG+SamsungRAW format */
220 } else if (codectype == MM_IMAGE_CODEC_SRW) {
221 fourcc = GST_MAKE_FOURCC('J', 'P', 'E', 'G'); /*TODO: SamsungRAW format */
222 } else if (codectype == MM_IMAGE_CODEC_PNG) {
223 fourcc = GST_MAKE_FOURCC('P', 'N', 'G', ' ');
225 /* Please let us know what other fourcces are. ex) BMP, GIF? */
226 fourcc = GST_MAKE_FOURCC('J', 'P', 'E', 'G');
229 case MM_PIXEL_FORMAT_ITLV_JPEG_UYVY:
230 fourcc = GST_MAKE_FOURCC('I', 'T', 'L', 'V');
233 _mmstreamrec_dbg_log("Not proper pixel type[%d]. Set default - I420", pixtype);
234 if (use_zero_copy_format)
235 fourcc = GST_MAKE_FOURCC('S', '4', '2', '0');
237 fourcc = GST_MAKE_FOURCC('I', '4', '2', '0');
244 int _mmstreamrecorder_get_pixtype(unsigned int fourcc)
246 int pixtype = MM_PIXEL_FORMAT_INVALID;
248 char *pfourcc = (char*)&fourcc;
249 _mmstreamrec_dbg_log("fourcc(%c%c%c%c)", pfourcc[0], pfourcc[1], pfourcc[2], pfourcc[3]);
252 case GST_MAKE_FOURCC('S', 'N', '1', '2'):
253 case GST_MAKE_FOURCC('N', 'V', '1', '2'):
254 pixtype = MM_PIXEL_FORMAT_NV12;
256 case GST_MAKE_FOURCC('S', 'U', 'Y', 'V'):
257 case GST_MAKE_FOURCC('Y', 'U', 'Y', 'V'):
258 case GST_MAKE_FOURCC('Y', 'U', 'Y', '2'):
259 pixtype = MM_PIXEL_FORMAT_YUYV;
261 case GST_MAKE_FOURCC('S', 'Y', 'V', 'Y'):
262 case GST_MAKE_FOURCC('U', 'Y', 'V', 'Y'):
263 pixtype = MM_PIXEL_FORMAT_UYVY;
265 case GST_MAKE_FOURCC('S', '4', '2', '0'):
266 case GST_MAKE_FOURCC('I', '4', '2', '0'):
267 pixtype = MM_PIXEL_FORMAT_I420;
269 case GST_MAKE_FOURCC('Y', 'V', '1', '2'):
270 pixtype = MM_PIXEL_FORMAT_YV12;
272 case GST_MAKE_FOURCC('4', '2', '2', 'P'):
273 pixtype = MM_PIXEL_FORMAT_422P;
275 case GST_MAKE_FOURCC('R', 'G', 'B', 'P'):
276 pixtype = MM_PIXEL_FORMAT_RGB565;
278 case GST_MAKE_FOURCC('R', 'G', 'B', '3'):
279 pixtype = MM_PIXEL_FORMAT_RGB888;
281 case GST_MAKE_FOURCC('A', 'R', 'G', 'B'):
282 case GST_MAKE_FOURCC('x', 'R', 'G', 'B'):
283 pixtype = MM_PIXEL_FORMAT_ARGB;
285 case GST_MAKE_FOURCC('B', 'G', 'R', 'A'):
286 case GST_MAKE_FOURCC('B', 'G', 'R', 'x'):
287 pixtype = MM_PIXEL_FORMAT_RGBA;
289 case GST_MAKE_FOURCC('J', 'P', 'E', 'G'):
290 case GST_MAKE_FOURCC('P', 'N', 'G', ' '):
291 pixtype = MM_PIXEL_FORMAT_ENCODED;
293 /*FIXME*/ case GST_MAKE_FOURCC('I', 'T', 'L', 'V'):
294 pixtype = MM_PIXEL_FORMAT_ITLV_JPEG_UYVY;
297 _mmstreamrec_dbg_log("Not supported fourcc type(%x)", fourcc);
304 guint16 get_language_code(const char *str)
306 return (guint16) (((str[0] - 0x60) & 0x1F) << 10) + (((str[1] - 0x60) & 0x1F) << 5) + ((str[2] - 0x60) & 0x1F);
309 gchar *str_to_utf8(const gchar * str)
311 return g_convert(str, -1, "UTF-8", "ASCII", NULL, NULL, NULL);
314 __attribute__ ((gnu_inline)) inline gboolean write_tag(FILE *f, const gchar *tag)
317 FPUTC_CHECK(*tag++, f);
322 __attribute__ ((gnu_inline)) inline gboolean write_to_32(FILE *f, guint val)
324 FPUTC_CHECK(val >> 24, f);
325 FPUTC_CHECK(val >> 16, f);
326 FPUTC_CHECK(val >> 8, f);