Seperate decode and picture_copy if no pix_fmt is specified
[platform/adaptation/emulator/gst-plugins-emulator.git] / src / gstmaru.h
1 /*
2  * GStreamer codec plugin for Tizen Emulator.
3  *
4  * Copyright (C) 2013 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact:
7  * KiTae Kim <kt920.kim@samsung.com>
8  * SeokYeon Hwang <syeon.hwang@samsung.com>
9  * YeongKyoon Lee <yeongkyoon.lee@samsung.com>
10  *
11  * This library is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Library General Public
13  * License as published by the Free Software Foundation; either
14  * version 2 of the License, or (at your option) any later version.
15  *
16  * This library is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Library General Public License for more details.
20  *
21  * You should have received a copy of the GNU Library General Public
22  * License along with this library; if not, write to the
23  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
24  * Boston, MA 02111-1307, USA.
25  *
26  * Contributors:
27  * - S-Core Co., Ltd
28  *
29  */
30
31 #ifndef __GST_MARU_H__
32 #define __GST_MARU_H__
33
34 #include <stdint.h>
35 #include <stdbool.h>
36 #include <stdio.h>
37 #include <stdlib.h>
38 #include <string.h>
39 #include <unistd.h>
40 #include <fcntl.h>
41 #include <sys/ioctl.h>
42 #include <sys/mman.h>
43 #include <glib.h>
44 #include <gst/gst.h>
45 #include "pixfmt.h"
46
47 GST_DEBUG_CATEGORY_EXTERN (maru_debug);
48 #define GST_CAT_DEFAULT maru_debug
49
50 G_BEGIN_DECLS
51
52 extern int device_version;
53
54 enum codec_log_level {
55   ERR,
56   WARN,
57   INFO,
58   DEBUG,
59 };
60
61 #define CODEC_DEV   "/dev/brillcodec"
62 #define CODEC_VER   3
63
64 #define CHECK_VERSION(version)        (device_version >= version)
65
66 #define CODEC_LOG(level, fmt, ...) \
67   do { \
68     if (level <= INFO) \
69       printf("[gst-maru][%s:%d] " fmt, __FILE__, __LINE__, ##__VA_ARGS__); \
70   } while (0)
71
72 #define FF_INPUT_BUFFER_PADDING_SIZE  8
73 #define FF_MAX_AUDIO_FRAME_SIZE       192000 // 1 second of 48khz 32bit audio
74 #define FF_MIN_BUFFER_SIZE            16384
75
76 #define GEN_MASK(x) ((1<<(x))-1)
77 #define ROUND_UP_X(v, x) (((v) + GEN_MASK(x)) & ~GEN_MASK(x))
78 #define ROUND_UP_2(x) ROUND_UP_X(x, 1)
79 #define ROUND_UP_4(x) ROUND_UP_X(x, 2)
80 #define ROUND_UP_8(x) ROUND_UP_X(x, 3)
81 #define DIV_ROUND_UP_X(v, x) (((v) + GEN_MASK(x)) >> (x))
82
83 static inline bool can_use_new_decode_api(void) {
84     if (CHECK_VERSION(3)) {
85         return true;
86     }
87     return false;
88 }
89
90 typedef struct _CodecDevice {
91   int       fd;
92   uint8_t   *buf;
93   uint32_t  buf_size;
94 } CodecDevice;
95
96 typedef struct _CodecElement {
97   int32_t codec_type;
98   int32_t media_type;
99   gchar name[32];
100   gchar longname[64];
101   union {
102     int32_t pix_fmts[4];
103     int32_t sample_fmts[4];
104   };
105 } CodecElement;
106
107 typedef struct _VideoData {
108   int32_t width, height;
109   int32_t fps_n, fps_d;
110   int32_t par_n, par_d;
111   int32_t pix_fmt, bpp;
112   int32_t ticks_per_frame;
113 } VideoData;
114
115 typedef struct _AudioData {
116   int32_t channels, sample_rate;
117   int32_t block_align, depth;
118   int32_t sample_fmt, frame_size;
119   int32_t bits_per_sample_fmt, reserved;
120   int64_t channel_layout;
121 } AudioData;
122
123 typedef struct _CodecContext {
124   VideoData video;
125   AudioData audio;
126
127   int32_t bit_rate;
128   int32_t codec_tag;
129
130   int32_t codecdata_size;
131   uint8_t *codecdata;
132
133   CodecElement *codec;
134   int32_t index;
135 } CodecContext;
136
137 enum CODEC_FUNC_TYPE {
138   CODEC_INIT = 0,
139   CODEC_DECODE_VIDEO,
140   CODEC_ENCODE_VIDEO,
141   CODEC_DECODE_AUDIO,
142   CODEC_ENCODE_AUDIO,
143   CODEC_PICTURE_COPY,
144   CODEC_DEINIT,
145   CODEC_FLUSH_BUFFERS,
146   CODEC_DECODE_VIDEO2,
147 };
148
149 enum CODEC_IO_CMD {
150   CODEC_CMD_GET_VERSION = 20,
151   CODEC_CMD_GET_ELEMENT,
152   CODEC_CMD_GET_CONTEXT_INDEX,
153   CODEC_CMD_GET_ELEMENT_DATA,
154   CODEC_CMD_PUT_DATA_INTO_BUFFER = 40,
155   CODEC_CMD_SECURE_BUFFER,
156   CODEC_CMD_TRY_SECURE_BUFFER,
157   CODEC_CMD_RELEASE_BUFFER,
158   CODEC_CMD_INVOKE_API_AND_RELEASE_BUFFER,
159 };
160
161 enum CODEC_MEDIA_TYPE {
162   AVMEDIA_TYPE_UNKNOWN = -1,
163   AVMEDIA_TYPE_VIDEO,
164   AVMEDIA_TYPE_AUDIO,
165 };
166
167 enum CODEC_TYPE {
168   CODEC_TYPE_UNKNOWN = -1,
169   CODEC_TYPE_DECODE,
170   CODEC_TYPE_ENCODE,
171 };
172
173 enum AUDIO_SAMPLE_FORMAT {
174   SAMPLE_FMT_NONE = -1,
175   SAMPLE_FMT_U8,
176   SAMPLE_FMT_S16,
177   SAMPLE_FMT_S32,
178   SAMPLE_FMT_FLT,
179   SAMPLE_FMT_DBL,
180
181   SAMPLE_FMT_U8P,
182   SAMPLE_FMT_S16P,
183   SAMPLE_FMT_S32P,
184   SAMPLE_FMT_FLTP,
185   SAMPLE_FMT_DBLP,
186   SAMPLE_FMT_NB
187 };
188
189 G_END_DECLS
190 #endif