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 if (!strcmp(media_type, "image/jpeg")) {
148 _mmstreamrec_dbg_log("It is jpeg.");
149 type = MM_PIXEL_FORMAT_ENCODED;
150 } else if (!strcmp(media_type, "video/x-raw-yuv")) {
151 _mmstreamrec_dbg_log("It is yuv.");
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");
159 } else if (!strcmp(media_type, "video/x-raw-rgb")) {
160 _mmstreamrec_dbg_log("It is rgb.");
161 type = MM_PIXEL_FORMAT_RGB888;
163 _mmstreamrec_dbg_err("Not supported format");
164 type = MM_PIXEL_FORMAT_INVALID;
167 _mmstreamrec_dbg_log("Type [%d]", type);
170 gst_caps_unref(caps);
176 unsigned int _mmstreamrecorder_get_fourcc(int pixtype, int codectype, int use_zero_copy_format)
178 unsigned int fourcc = 0;
180 _mmstreamrec_dbg_log("pixtype(%d)", pixtype);
183 case MM_PIXEL_FORMAT_NV12:
184 if (use_zero_copy_format)
185 fourcc = GST_MAKE_FOURCC('S', 'N', '1', '2');
187 fourcc = GST_MAKE_FOURCC('N', 'V', '1', '2');
189 case MM_PIXEL_FORMAT_YUYV:
190 if (use_zero_copy_format)
191 fourcc = GST_MAKE_FOURCC('S', 'U', 'Y', 'V');
193 fourcc = GST_MAKE_FOURCC('Y', 'U', 'Y', '2');
195 case MM_PIXEL_FORMAT_UYVY:
196 if (use_zero_copy_format)
197 fourcc = GST_MAKE_FOURCC('S', 'Y', 'V', 'Y');
199 fourcc = GST_MAKE_FOURCC('U', 'Y', 'V', 'Y');
202 case MM_PIXEL_FORMAT_I420:
203 if (use_zero_copy_format)
204 fourcc = GST_MAKE_FOURCC('S', '4', '2', '0');
206 fourcc = GST_MAKE_FOURCC('I', '4', '2', '0');
208 case MM_PIXEL_FORMAT_YV12:
209 fourcc = GST_MAKE_FOURCC('Y', 'V', '1', '2');
211 case MM_PIXEL_FORMAT_422P:
212 fourcc = GST_MAKE_FOURCC('4', '2', '2', 'P');
214 case MM_PIXEL_FORMAT_RGB565:
215 fourcc = GST_MAKE_FOURCC('R', 'G', 'B', 'P');
217 case MM_PIXEL_FORMAT_RGB888:
218 fourcc = GST_MAKE_FOURCC('R', 'G', 'B', ' ');
220 case MM_PIXEL_FORMAT_ENCODED:
221 if (codectype == MM_IMAGE_CODEC_JPEG) {
222 fourcc = GST_MAKE_FOURCC('J', 'P', 'E', 'G');
223 } else if (codectype == MM_IMAGE_CODEC_JPEG_SRW) {
224 fourcc = GST_MAKE_FOURCC('J', 'P', 'E', 'G'); /*TODO: JPEG+SamsungRAW format */
225 } else if (codectype == MM_IMAGE_CODEC_SRW) {
226 fourcc = GST_MAKE_FOURCC('J', 'P', 'E', 'G'); /*TODO: SamsungRAW format */
227 } else if (codectype == MM_IMAGE_CODEC_PNG) {
228 fourcc = GST_MAKE_FOURCC('P', 'N', 'G', ' ');
230 /* Please let us know what other fourcces are. ex) BMP, GIF? */
231 fourcc = GST_MAKE_FOURCC('J', 'P', 'E', 'G');
234 case MM_PIXEL_FORMAT_ITLV_JPEG_UYVY:
235 fourcc = GST_MAKE_FOURCC('I', 'T', 'L', 'V');
238 _mmstreamrec_dbg_log("Not proper pixel type[%d]. Set default - I420", pixtype);
239 if (use_zero_copy_format)
240 fourcc = GST_MAKE_FOURCC('S', '4', '2', '0');
242 fourcc = GST_MAKE_FOURCC('I', '4', '2', '0');
249 int _mmstreamrecorder_get_pixtype(unsigned int fourcc)
251 int pixtype = MM_PIXEL_FORMAT_INVALID;
253 char *pfourcc = (char*)&fourcc;
254 _mmstreamrec_dbg_log("fourcc(%c%c%c%c)", pfourcc[0], pfourcc[1], pfourcc[2], pfourcc[3]);
257 case GST_MAKE_FOURCC('S', 'N', '1', '2'):
258 case GST_MAKE_FOURCC('N', 'V', '1', '2'):
259 pixtype = MM_PIXEL_FORMAT_NV12;
261 case GST_MAKE_FOURCC('S', 'U', 'Y', 'V'):
262 case GST_MAKE_FOURCC('Y', 'U', 'Y', 'V'):
263 case GST_MAKE_FOURCC('Y', 'U', 'Y', '2'):
264 pixtype = MM_PIXEL_FORMAT_YUYV;
266 case GST_MAKE_FOURCC('S', 'Y', 'V', 'Y'):
267 case GST_MAKE_FOURCC('U', 'Y', 'V', 'Y'):
268 pixtype = MM_PIXEL_FORMAT_UYVY;
270 case GST_MAKE_FOURCC('S', '4', '2', '0'):
271 case GST_MAKE_FOURCC('I', '4', '2', '0'):
272 pixtype = MM_PIXEL_FORMAT_I420;
274 case GST_MAKE_FOURCC('Y', 'V', '1', '2'):
275 pixtype = MM_PIXEL_FORMAT_YV12;
277 case GST_MAKE_FOURCC('4', '2', '2', 'P'):
278 pixtype = MM_PIXEL_FORMAT_422P;
280 case GST_MAKE_FOURCC('R', 'G', 'B', 'P'):
281 pixtype = MM_PIXEL_FORMAT_RGB565;
283 case GST_MAKE_FOURCC('R', 'G', 'B', '3'):
284 pixtype = MM_PIXEL_FORMAT_RGB888;
286 case GST_MAKE_FOURCC('A', 'R', 'G', 'B'):
287 case GST_MAKE_FOURCC('x', 'R', 'G', 'B'):
288 pixtype = MM_PIXEL_FORMAT_ARGB;
290 case GST_MAKE_FOURCC('B', 'G', 'R', 'A'):
291 case GST_MAKE_FOURCC('B', 'G', 'R', 'x'):
292 pixtype = MM_PIXEL_FORMAT_RGBA;
294 case GST_MAKE_FOURCC('J', 'P', 'E', 'G'):
295 case GST_MAKE_FOURCC('P', 'N', 'G', ' '):
296 pixtype = MM_PIXEL_FORMAT_ENCODED;
298 /*FIXME*/ case GST_MAKE_FOURCC('I', 'T', 'L', 'V'):
299 pixtype = MM_PIXEL_FORMAT_ITLV_JPEG_UYVY;
302 _mmstreamrec_dbg_log("Not supported fourcc type(%x)", fourcc);
303 pixtype = MM_PIXEL_FORMAT_INVALID;
310 guint16 get_language_code(const char *str)
312 return (guint16) (((str[0] - 0x60) & 0x1F) << 10) + (((str[1] - 0x60) & 0x1F) << 5) + ((str[2] - 0x60) & 0x1F);
315 gchar *str_to_utf8(const gchar * str)
317 return g_convert(str, -1, "UTF-8", "ASCII", NULL, NULL, NULL);
320 __attribute__ ((gnu_inline)) inline gboolean write_tag(FILE *f, const gchar *tag)
323 FPUTC_CHECK(*tag++, f);
328 __attribute__ ((gnu_inline)) inline gboolean write_to_32(FILE *f, guint val)
330 FPUTC_CHECK(val >> 24, f);
331 FPUTC_CHECK(val >> 16, f);
332 FPUTC_CHECK(val >> 8, f);