1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka * Copyright (c) 2015 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka */
5*437bfbebSnyanmisaka
6*437bfbebSnyanmisaka #define MODULE_TAG "mpp_impl"
7*437bfbebSnyanmisaka
8*437bfbebSnyanmisaka #include <time.h>
9*437bfbebSnyanmisaka #include <stdarg.h>
10*437bfbebSnyanmisaka #include <sys/types.h>
11*437bfbebSnyanmisaka #include <sys/syscall.h>
12*437bfbebSnyanmisaka
13*437bfbebSnyanmisaka #include "rk_mpi_cmd.h"
14*437bfbebSnyanmisaka
15*437bfbebSnyanmisaka #include "mpp_env.h"
16*437bfbebSnyanmisaka #include "mpp_mem.h"
17*437bfbebSnyanmisaka #include "mpp_time.h"
18*437bfbebSnyanmisaka #include "mpp_debug.h"
19*437bfbebSnyanmisaka #include "mpp_thread.h"
20*437bfbebSnyanmisaka #include "mpp_common.h"
21*437bfbebSnyanmisaka
22*437bfbebSnyanmisaka #include "mpp_impl.h"
23*437bfbebSnyanmisaka
24*437bfbebSnyanmisaka #define MAX_FILE_NAME_LEN 512
25*437bfbebSnyanmisaka #define MAX_DUMP_WIDTH 960
26*437bfbebSnyanmisaka #define MAX_DUMP_HEIGHT 540
27*437bfbebSnyanmisaka
28*437bfbebSnyanmisaka #define ops_log(fp, fmt, ...) _ops_log(fp, fmt, ## __VA_ARGS__)
29*437bfbebSnyanmisaka
30*437bfbebSnyanmisaka typedef enum MppOpsType_e {
31*437bfbebSnyanmisaka MPP_DEC_OPS_BASE = 0,
32*437bfbebSnyanmisaka MPP_DEC_INIT = MPP_DEC_OPS_BASE,
33*437bfbebSnyanmisaka MPP_DEC_SE
34*437bfbebSnyanmisaka } MppOpsType;
35*437bfbebSnyanmisaka
36*437bfbebSnyanmisaka /* dump data */
37*437bfbebSnyanmisaka typedef struct MppDumpImpl_t {
38*437bfbebSnyanmisaka MppMutex lock;
39*437bfbebSnyanmisaka RK_U32 log_version;
40*437bfbebSnyanmisaka RK_U32 debug;
41*437bfbebSnyanmisaka pid_t tid;
42*437bfbebSnyanmisaka RK_S64 time_base;
43*437bfbebSnyanmisaka
44*437bfbebSnyanmisaka MppCtxType type;
45*437bfbebSnyanmisaka MppCodingType coding;
46*437bfbebSnyanmisaka
47*437bfbebSnyanmisaka FILE *fp_in; // file for MppPacket
48*437bfbebSnyanmisaka FILE *fp_out; // file for MppFrame
49*437bfbebSnyanmisaka FILE *fp_ops; // file for decoder / encoder extra info
50*437bfbebSnyanmisaka
51*437bfbebSnyanmisaka RK_U8 *fp_buf; // for resample frame
52*437bfbebSnyanmisaka RK_U32 pkt_offset;
53*437bfbebSnyanmisaka RK_U32 dump_width;
54*437bfbebSnyanmisaka RK_U32 dump_height;
55*437bfbebSnyanmisaka RK_U32 dump_size;
56*437bfbebSnyanmisaka
57*437bfbebSnyanmisaka RK_U32 idx;
58*437bfbebSnyanmisaka } MppDumpImpl;
59*437bfbebSnyanmisaka
60*437bfbebSnyanmisaka typedef union OpsArgs_u {
61*437bfbebSnyanmisaka struct MppOpsInitArg_t {
62*437bfbebSnyanmisaka MppCtxType type;
63*437bfbebSnyanmisaka MppCodingType coding;
64*437bfbebSnyanmisaka } init_arg;
65*437bfbebSnyanmisaka
66*437bfbebSnyanmisaka struct MppOpsPktArg_t {
67*437bfbebSnyanmisaka RK_U32 offset; // offset in packet file
68*437bfbebSnyanmisaka RK_U32 length; // pakcet length
69*437bfbebSnyanmisaka RK_S64 pts;
70*437bfbebSnyanmisaka } pkt_arg;
71*437bfbebSnyanmisaka
72*437bfbebSnyanmisaka struct MppOpsFrmArg_t {
73*437bfbebSnyanmisaka RK_U32 fd;
74*437bfbebSnyanmisaka RK_U32 info_change;
75*437bfbebSnyanmisaka RK_U32 error;
76*437bfbebSnyanmisaka RK_U32 discard;
77*437bfbebSnyanmisaka RK_S64 pts;
78*437bfbebSnyanmisaka } frm_arg;
79*437bfbebSnyanmisaka
80*437bfbebSnyanmisaka struct MppOpCtrlArg_t {
81*437bfbebSnyanmisaka MpiCmd cmd;
82*437bfbebSnyanmisaka } ctrl_arg;
83*437bfbebSnyanmisaka } OpsArgs;
84*437bfbebSnyanmisaka
85*437bfbebSnyanmisaka typedef struct MppOpsInfo_t {
86*437bfbebSnyanmisaka RK_U32 idx;
87*437bfbebSnyanmisaka RK_U32 id;
88*437bfbebSnyanmisaka RK_S64 time;
89*437bfbebSnyanmisaka OpsArgs args;
90*437bfbebSnyanmisaka } MppOpsInfo;
91*437bfbebSnyanmisaka
92*437bfbebSnyanmisaka /*
93*437bfbebSnyanmisaka * decoder file dump:
94*437bfbebSnyanmisaka * dec_pkt - decoder input byte raw stream file
95*437bfbebSnyanmisaka * dec_cfg - decoder input stream offset and size info in format [u32 offset|u32 size]
96*437bfbebSnyanmisaka * dec_frm - decoder output frame file with snapshot method
97*437bfbebSnyanmisaka */
98*437bfbebSnyanmisaka static const char dec_pkt_path[] = "/data/mpp_dec_in.bin";
99*437bfbebSnyanmisaka static const char dec_ops_path[] = "/data/mpp_dec_ops.bin";
100*437bfbebSnyanmisaka static const char dec_frm_path[] = "/data/mpp_dec_out.bin";
101*437bfbebSnyanmisaka
102*437bfbebSnyanmisaka static const char enc_frm_path[] = "/data/mpp_enc_in.bin";
103*437bfbebSnyanmisaka static const char enc_ops_path[] = "/data/mpp_enc_ops.bin";
104*437bfbebSnyanmisaka static const char enc_pkt_path[] = "/data/mpp_enc_out.bin";
105*437bfbebSnyanmisaka
try_env_file(const char * env,const char * path,pid_t tid)106*437bfbebSnyanmisaka static FILE *try_env_file(const char *env, const char *path, pid_t tid)
107*437bfbebSnyanmisaka {
108*437bfbebSnyanmisaka const char *fname = NULL;
109*437bfbebSnyanmisaka FILE *fp = NULL;
110*437bfbebSnyanmisaka char name[MAX_FILE_NAME_LEN];
111*437bfbebSnyanmisaka
112*437bfbebSnyanmisaka mpp_env_get_str(env, &fname, path);
113*437bfbebSnyanmisaka if (fname == path) {
114*437bfbebSnyanmisaka snprintf(name, sizeof(name) - 1, "%s-%d", path, tid);
115*437bfbebSnyanmisaka fname = name;
116*437bfbebSnyanmisaka }
117*437bfbebSnyanmisaka
118*437bfbebSnyanmisaka fp = fopen(fname, "w+b");
119*437bfbebSnyanmisaka mpp_log("open %s %p for dump\n", fname, fp);
120*437bfbebSnyanmisaka
121*437bfbebSnyanmisaka return fp;
122*437bfbebSnyanmisaka }
123*437bfbebSnyanmisaka
fetch_data(RK_U32 fmt,RK_U8 * line,RK_U32 num)124*437bfbebSnyanmisaka static RK_U8 fetch_data(RK_U32 fmt, RK_U8 *line, RK_U32 num)
125*437bfbebSnyanmisaka {
126*437bfbebSnyanmisaka RK_U32 offset = 0;
127*437bfbebSnyanmisaka RK_U32 value = 0;
128*437bfbebSnyanmisaka
129*437bfbebSnyanmisaka if (fmt == MPP_FMT_YUV420SP_10BIT) {
130*437bfbebSnyanmisaka offset = (num * 2) & 7;
131*437bfbebSnyanmisaka value = (line[num * 10 / 8] >> offset) |
132*437bfbebSnyanmisaka (line[num * 10 / 8 + 1] << (8 - offset));
133*437bfbebSnyanmisaka
134*437bfbebSnyanmisaka value = (value & 0x3ff) >> 2;
135*437bfbebSnyanmisaka } else if (fmt == MPP_FMT_YUV420SP) {
136*437bfbebSnyanmisaka value = line[num];
137*437bfbebSnyanmisaka }
138*437bfbebSnyanmisaka
139*437bfbebSnyanmisaka return (RK_U8)value;
140*437bfbebSnyanmisaka }
141*437bfbebSnyanmisaka
rearrange_pix(RK_U8 * tmp_line,RK_U8 * base,RK_U32 n)142*437bfbebSnyanmisaka static void rearrange_pix(RK_U8 *tmp_line, RK_U8 *base, RK_U32 n)
143*437bfbebSnyanmisaka {
144*437bfbebSnyanmisaka RK_U16 * pix = (RK_U16 *)(tmp_line + n * 16);
145*437bfbebSnyanmisaka RK_U16 * base_u16 = (RK_U16 *)(base + n * 10);
146*437bfbebSnyanmisaka
147*437bfbebSnyanmisaka pix[0] = base_u16[0] & 0x03FF;
148*437bfbebSnyanmisaka pix[1] = (base_u16[0] & 0xFC00) >> 10 | (base_u16[1] & 0x000F) << 6;
149*437bfbebSnyanmisaka pix[2] = (base_u16[1] & 0x3FF0) >> 4;
150*437bfbebSnyanmisaka pix[3] = (base_u16[1] & 0xC000) >> 14 | (base_u16[2] & 0x00FF) << 2;
151*437bfbebSnyanmisaka pix[4] = (base_u16[2] & 0xFF00) >> 8 | (base_u16[3] & 0x0003) << 8;
152*437bfbebSnyanmisaka pix[5] = (base_u16[3] & 0x0FFC) >> 2;
153*437bfbebSnyanmisaka pix[6] = (base_u16[3] & 0xF000) >> 12 | (base_u16[4] & 0x003F) << 4;
154*437bfbebSnyanmisaka pix[7] = (base_u16[4] & 0xFFC0) >> 6;
155*437bfbebSnyanmisaka }
156*437bfbebSnyanmisaka
dump_frame(FILE * fp,MppFrame frame,RK_U8 * tmp,RK_U32 w,RK_U32 h)157*437bfbebSnyanmisaka static void dump_frame(FILE *fp, MppFrame frame, RK_U8 *tmp, RK_U32 w, RK_U32 h)
158*437bfbebSnyanmisaka {
159*437bfbebSnyanmisaka RK_U32 i = 0, j = 0;
160*437bfbebSnyanmisaka RK_U32 fmt = (mpp_frame_get_fmt(frame) & MPP_FRAME_FMT_MASK);
161*437bfbebSnyanmisaka RK_U32 width = mpp_frame_get_width(frame);
162*437bfbebSnyanmisaka RK_U32 height = mpp_frame_get_height(frame);
163*437bfbebSnyanmisaka RK_U32 hor_stride = mpp_frame_get_hor_stride(frame);
164*437bfbebSnyanmisaka RK_U32 ver_stride = mpp_frame_get_ver_stride(frame);
165*437bfbebSnyanmisaka RK_U8 *p_buf = (RK_U8 *) mpp_buffer_get_ptr(mpp_frame_get_buffer(frame));
166*437bfbebSnyanmisaka
167*437bfbebSnyanmisaka RK_U8 *psrc = p_buf;
168*437bfbebSnyanmisaka RK_U8 *pdes = tmp;
169*437bfbebSnyanmisaka RK_U32 size = 0;
170*437bfbebSnyanmisaka
171*437bfbebSnyanmisaka if (pdes) {
172*437bfbebSnyanmisaka if (hor_stride > w || ver_stride > h) {
173*437bfbebSnyanmisaka RK_U32 step = MPP_MAX((hor_stride + w - 1) / w,
174*437bfbebSnyanmisaka (ver_stride + h - 1) / h);
175*437bfbebSnyanmisaka RK_U32 img_w = width / step;
176*437bfbebSnyanmisaka RK_U32 img_h = height / step;
177*437bfbebSnyanmisaka
178*437bfbebSnyanmisaka img_w -= img_w & 0x1;
179*437bfbebSnyanmisaka img_h -= img_h & 0x1;
180*437bfbebSnyanmisaka for (i = 0; i < img_h; i++) {
181*437bfbebSnyanmisaka for (j = 0; j < img_w; j++)
182*437bfbebSnyanmisaka pdes[j] = fetch_data(fmt, psrc, j * step);
183*437bfbebSnyanmisaka pdes += img_w;
184*437bfbebSnyanmisaka psrc += step * hor_stride;
185*437bfbebSnyanmisaka }
186*437bfbebSnyanmisaka psrc = p_buf + hor_stride * ver_stride;
187*437bfbebSnyanmisaka pdes = tmp + img_w * img_h;
188*437bfbebSnyanmisaka for (i = 0; i < (img_h / 2); i++) {
189*437bfbebSnyanmisaka for (j = 0; j < (img_w / 2); j++) {
190*437bfbebSnyanmisaka pdes[2 * j + 0] = fetch_data(fmt, psrc, 2 * j * step + 0);
191*437bfbebSnyanmisaka pdes[2 * j + 1] = fetch_data(fmt, psrc, 2 * j * step + 1);
192*437bfbebSnyanmisaka }
193*437bfbebSnyanmisaka pdes += img_w;
194*437bfbebSnyanmisaka psrc += step * hor_stride;
195*437bfbebSnyanmisaka }
196*437bfbebSnyanmisaka width = img_w;
197*437bfbebSnyanmisaka height = img_h;
198*437bfbebSnyanmisaka } else if (fmt == MPP_FMT_YUV420SP_10BIT) {
199*437bfbebSnyanmisaka for (i = 0; i < height; i++) {
200*437bfbebSnyanmisaka for (j = 0; j < width; j++)
201*437bfbebSnyanmisaka pdes[j] = fetch_data(fmt, psrc, j);
202*437bfbebSnyanmisaka pdes += width;
203*437bfbebSnyanmisaka psrc += hor_stride;
204*437bfbebSnyanmisaka }
205*437bfbebSnyanmisaka psrc = p_buf + hor_stride * ver_stride;
206*437bfbebSnyanmisaka pdes = tmp + width * height;
207*437bfbebSnyanmisaka for (i = 0; i < height / 2; i++) {
208*437bfbebSnyanmisaka for (j = 0; j < width; j++)
209*437bfbebSnyanmisaka pdes[j] = fetch_data(fmt, psrc, j);
210*437bfbebSnyanmisaka pdes += width;
211*437bfbebSnyanmisaka psrc += hor_stride;
212*437bfbebSnyanmisaka }
213*437bfbebSnyanmisaka }
214*437bfbebSnyanmisaka size = width * height * 1.5;
215*437bfbebSnyanmisaka } else {
216*437bfbebSnyanmisaka tmp = p_buf;
217*437bfbebSnyanmisaka switch (fmt) {
218*437bfbebSnyanmisaka case MPP_FMT_YUV420SP :
219*437bfbebSnyanmisaka case MPP_FMT_YUV420P : {
220*437bfbebSnyanmisaka size = hor_stride * ver_stride * 3 / 2;
221*437bfbebSnyanmisaka } break;
222*437bfbebSnyanmisaka case MPP_FMT_YUV422SP : {
223*437bfbebSnyanmisaka size = hor_stride * ver_stride * 2;
224*437bfbebSnyanmisaka } break;
225*437bfbebSnyanmisaka case MPP_FMT_YUV444SP : {
226*437bfbebSnyanmisaka size = hor_stride * ver_stride * 3;
227*437bfbebSnyanmisaka } break;
228*437bfbebSnyanmisaka case MPP_FMT_YUV420SP_10BIT : {
229*437bfbebSnyanmisaka RK_U8 *base_y = p_buf;
230*437bfbebSnyanmisaka RK_U8 *base_c = p_buf + hor_stride * ver_stride;
231*437bfbebSnyanmisaka RK_U8 *tmp_line = (RK_U8 *)mpp_malloc(RK_U16, width);
232*437bfbebSnyanmisaka
233*437bfbebSnyanmisaka if (!tmp_line) {
234*437bfbebSnyanmisaka mpp_log("tmp_line malloc fail");
235*437bfbebSnyanmisaka return;
236*437bfbebSnyanmisaka }
237*437bfbebSnyanmisaka
238*437bfbebSnyanmisaka for (i = 0; i < height; i++, base_y += hor_stride) {
239*437bfbebSnyanmisaka for (j = 0; j < MPP_ALIGN(width, 8) / 8; j++)
240*437bfbebSnyanmisaka rearrange_pix(tmp_line, base_y, j);
241*437bfbebSnyanmisaka fwrite(tmp_line, width * sizeof(RK_U16), 1, fp);
242*437bfbebSnyanmisaka }
243*437bfbebSnyanmisaka
244*437bfbebSnyanmisaka for (i = 0; i < height / 2; i++, base_c += hor_stride) {
245*437bfbebSnyanmisaka for (j = 0; j < MPP_ALIGN(width, 8) / 8; j++)
246*437bfbebSnyanmisaka rearrange_pix(tmp_line, base_c, j);
247*437bfbebSnyanmisaka fwrite(tmp_line, width * sizeof(RK_U16), 1, fp);
248*437bfbebSnyanmisaka }
249*437bfbebSnyanmisaka MPP_FREE(tmp_line);
250*437bfbebSnyanmisaka }
251*437bfbebSnyanmisaka default : break;
252*437bfbebSnyanmisaka }
253*437bfbebSnyanmisaka }
254*437bfbebSnyanmisaka mpp_log("dump_yuv: w:h [%d:%d] stride [%d:%d] pts %lld\n",
255*437bfbebSnyanmisaka width, height, hor_stride, ver_stride, mpp_frame_get_pts(frame));
256*437bfbebSnyanmisaka if (size)
257*437bfbebSnyanmisaka fwrite(tmp, 1, size, fp);
258*437bfbebSnyanmisaka fflush(fp);
259*437bfbebSnyanmisaka }
260*437bfbebSnyanmisaka
_ops_log(FILE * fp,const char * fmt,...)261*437bfbebSnyanmisaka void _ops_log(FILE *fp, const char *fmt, ...)
262*437bfbebSnyanmisaka {
263*437bfbebSnyanmisaka struct tm tm_buf;
264*437bfbebSnyanmisaka struct tm* ptm;
265*437bfbebSnyanmisaka struct timespec tp;
266*437bfbebSnyanmisaka char logs[64];
267*437bfbebSnyanmisaka size_t len = 0;
268*437bfbebSnyanmisaka va_list args;
269*437bfbebSnyanmisaka va_start(args, fmt);
270*437bfbebSnyanmisaka
271*437bfbebSnyanmisaka clock_gettime(CLOCK_REALTIME_COARSE, &tp);
272*437bfbebSnyanmisaka ptm = localtime_r(&tp.tv_sec, &tm_buf);
273*437bfbebSnyanmisaka len = strftime(logs, sizeof(logs), "%m-%d %H:%M:%S", ptm);
274*437bfbebSnyanmisaka mpp_assert(len < sizeof(logs));
275*437bfbebSnyanmisaka fprintf(fp, "%s.%03ld,", logs, tp.tv_nsec / 1000000);
276*437bfbebSnyanmisaka vfprintf(fp, fmt, args);
277*437bfbebSnyanmisaka fflush(fp);
278*437bfbebSnyanmisaka
279*437bfbebSnyanmisaka va_end(args);
280*437bfbebSnyanmisaka }
281*437bfbebSnyanmisaka
mpp_dump_init(MppDump * info)282*437bfbebSnyanmisaka MPP_RET mpp_dump_init(MppDump *info)
283*437bfbebSnyanmisaka {
284*437bfbebSnyanmisaka if (!(mpp_debug & (MPP_DBG_DUMP_IN | MPP_DBG_DUMP_OUT | MPP_DBG_DUMP_CFG))) {
285*437bfbebSnyanmisaka *info = NULL;
286*437bfbebSnyanmisaka return MPP_OK;
287*437bfbebSnyanmisaka }
288*437bfbebSnyanmisaka
289*437bfbebSnyanmisaka MppDumpImpl *p = mpp_calloc(MppDumpImpl, 1);
290*437bfbebSnyanmisaka
291*437bfbebSnyanmisaka mpp_env_get_u32("mpp_dump_width", &p->dump_width, 0);
292*437bfbebSnyanmisaka mpp_env_get_u32("mpp_dump_height", &p->dump_height, 0);
293*437bfbebSnyanmisaka p->dump_size = p->dump_width * p->dump_height * 3 / 2;
294*437bfbebSnyanmisaka
295*437bfbebSnyanmisaka mpp_mutex_init(&p->lock);
296*437bfbebSnyanmisaka p->debug = mpp_debug;
297*437bfbebSnyanmisaka p->tid = syscall(SYS_gettid);
298*437bfbebSnyanmisaka p->log_version = 0;
299*437bfbebSnyanmisaka p->time_base = mpp_time();
300*437bfbebSnyanmisaka
301*437bfbebSnyanmisaka *info = p;
302*437bfbebSnyanmisaka
303*437bfbebSnyanmisaka return MPP_OK;
304*437bfbebSnyanmisaka }
305*437bfbebSnyanmisaka
mpp_dump_deinit(MppDump * info)306*437bfbebSnyanmisaka MPP_RET mpp_dump_deinit(MppDump *info)
307*437bfbebSnyanmisaka {
308*437bfbebSnyanmisaka if (info && *info) {
309*437bfbebSnyanmisaka MppDumpImpl *p = (MppDumpImpl *)*info;
310*437bfbebSnyanmisaka
311*437bfbebSnyanmisaka MPP_FCLOSE(p->fp_in);
312*437bfbebSnyanmisaka MPP_FCLOSE(p->fp_out);
313*437bfbebSnyanmisaka MPP_FCLOSE(p->fp_ops);
314*437bfbebSnyanmisaka MPP_FREE(p->fp_buf);
315*437bfbebSnyanmisaka
316*437bfbebSnyanmisaka mpp_mutex_destroy(&p->lock);
317*437bfbebSnyanmisaka }
318*437bfbebSnyanmisaka
319*437bfbebSnyanmisaka return MPP_OK;
320*437bfbebSnyanmisaka }
321*437bfbebSnyanmisaka
mpp_ops_init(MppDump info,MppCtxType type,MppCodingType coding)322*437bfbebSnyanmisaka MPP_RET mpp_ops_init(MppDump info, MppCtxType type, MppCodingType coding)
323*437bfbebSnyanmisaka {
324*437bfbebSnyanmisaka MppDumpImpl *p = (MppDumpImpl *)info;
325*437bfbebSnyanmisaka
326*437bfbebSnyanmisaka if (NULL == info)
327*437bfbebSnyanmisaka return MPP_OK;
328*437bfbebSnyanmisaka
329*437bfbebSnyanmisaka mpp_mutex_lock(&p->lock);
330*437bfbebSnyanmisaka
331*437bfbebSnyanmisaka p->type = type;
332*437bfbebSnyanmisaka p->coding = coding;
333*437bfbebSnyanmisaka
334*437bfbebSnyanmisaka if (type == MPP_CTX_DEC) {
335*437bfbebSnyanmisaka if (p->debug & MPP_DBG_DUMP_IN)
336*437bfbebSnyanmisaka p->fp_in = try_env_file("mpp_dump_in", dec_pkt_path, p->tid);
337*437bfbebSnyanmisaka
338*437bfbebSnyanmisaka if (p->debug & MPP_DBG_DUMP_OUT) {
339*437bfbebSnyanmisaka p->fp_out = try_env_file("mpp_dump_out", dec_frm_path, p->tid);
340*437bfbebSnyanmisaka if (p->dump_size)
341*437bfbebSnyanmisaka p->fp_buf = mpp_malloc(RK_U8, p->dump_size);
342*437bfbebSnyanmisaka }
343*437bfbebSnyanmisaka
344*437bfbebSnyanmisaka if (p->debug & MPP_DBG_DUMP_CFG)
345*437bfbebSnyanmisaka p->fp_ops = try_env_file("mpp_dump_ops", dec_ops_path, p->tid);
346*437bfbebSnyanmisaka } else {
347*437bfbebSnyanmisaka if (p->debug & MPP_DBG_DUMP_IN) {
348*437bfbebSnyanmisaka p->fp_in = try_env_file("mpp_dump_in", enc_frm_path, p->tid);
349*437bfbebSnyanmisaka if (p->dump_size)
350*437bfbebSnyanmisaka p->fp_buf = mpp_malloc(RK_U8, p->dump_size);
351*437bfbebSnyanmisaka }
352*437bfbebSnyanmisaka
353*437bfbebSnyanmisaka if (p->debug & MPP_DBG_DUMP_OUT)
354*437bfbebSnyanmisaka p->fp_out = try_env_file("mpp_dump_out", enc_pkt_path, p->tid);
355*437bfbebSnyanmisaka
356*437bfbebSnyanmisaka if (p->debug & MPP_DBG_DUMP_CFG)
357*437bfbebSnyanmisaka p->fp_ops = try_env_file("mpp_dump_ops", enc_ops_path, p->tid);
358*437bfbebSnyanmisaka }
359*437bfbebSnyanmisaka
360*437bfbebSnyanmisaka if (p->fp_ops)
361*437bfbebSnyanmisaka ops_log(p->fp_ops, "%d,%s,%d,%d\n", p->idx++, "init", type, coding);
362*437bfbebSnyanmisaka
363*437bfbebSnyanmisaka mpp_mutex_unlock(&p->lock);
364*437bfbebSnyanmisaka
365*437bfbebSnyanmisaka return MPP_OK;
366*437bfbebSnyanmisaka }
367*437bfbebSnyanmisaka
mpp_ops_dec_put_pkt(MppDump info,MppPacket pkt)368*437bfbebSnyanmisaka MPP_RET mpp_ops_dec_put_pkt(MppDump info, MppPacket pkt)
369*437bfbebSnyanmisaka {
370*437bfbebSnyanmisaka MppDumpImpl *p = (MppDumpImpl *)info;
371*437bfbebSnyanmisaka if (NULL == p || NULL == pkt || NULL == p->fp_in)
372*437bfbebSnyanmisaka return MPP_OK;
373*437bfbebSnyanmisaka
374*437bfbebSnyanmisaka RK_U32 length = mpp_packet_get_length(pkt);
375*437bfbebSnyanmisaka
376*437bfbebSnyanmisaka mpp_mutex_lock(&p->lock);
377*437bfbebSnyanmisaka
378*437bfbebSnyanmisaka if (p->fp_in) {
379*437bfbebSnyanmisaka fwrite(mpp_packet_get_data(pkt), 1, length, p->fp_in);
380*437bfbebSnyanmisaka fflush(p->fp_in);
381*437bfbebSnyanmisaka }
382*437bfbebSnyanmisaka
383*437bfbebSnyanmisaka if (p->fp_ops) {
384*437bfbebSnyanmisaka ops_log(p->fp_ops, "%d,%s,%d,%d\n", p->idx++, "pkt", p->pkt_offset, length);
385*437bfbebSnyanmisaka
386*437bfbebSnyanmisaka p->pkt_offset += length;
387*437bfbebSnyanmisaka }
388*437bfbebSnyanmisaka
389*437bfbebSnyanmisaka mpp_mutex_unlock(&p->lock);
390*437bfbebSnyanmisaka
391*437bfbebSnyanmisaka return MPP_OK;
392*437bfbebSnyanmisaka }
393*437bfbebSnyanmisaka
mpp_ops_dec_get_frm(MppDump info,MppFrame frame)394*437bfbebSnyanmisaka MPP_RET mpp_ops_dec_get_frm(MppDump info, MppFrame frame)
395*437bfbebSnyanmisaka {
396*437bfbebSnyanmisaka MppDumpImpl *p = (MppDumpImpl *)info;
397*437bfbebSnyanmisaka
398*437bfbebSnyanmisaka if (NULL == p || NULL == frame || NULL == p->fp_out)
399*437bfbebSnyanmisaka return MPP_OK;
400*437bfbebSnyanmisaka
401*437bfbebSnyanmisaka mpp_mutex_lock(&p->lock);
402*437bfbebSnyanmisaka
403*437bfbebSnyanmisaka MppBuffer buf = mpp_frame_get_buffer(frame);
404*437bfbebSnyanmisaka RK_S32 fd = (buf) ? mpp_buffer_get_fd(buf) : (-1);
405*437bfbebSnyanmisaka RK_U32 info_change = mpp_frame_get_info_change(frame);
406*437bfbebSnyanmisaka RK_U32 error = mpp_frame_get_errinfo(frame);
407*437bfbebSnyanmisaka RK_U32 discard = mpp_frame_get_discard(frame);
408*437bfbebSnyanmisaka
409*437bfbebSnyanmisaka if (p->fp_ops) {
410*437bfbebSnyanmisaka ops_log(p->fp_ops, "%d,%s,%d,%d,%d,%d,%lld\n", p->idx, "frm", fd,
411*437bfbebSnyanmisaka info_change, error, discard, mpp_frame_get_pts(frame));
412*437bfbebSnyanmisaka }
413*437bfbebSnyanmisaka
414*437bfbebSnyanmisaka if (NULL == buf || fd < 0) {
415*437bfbebSnyanmisaka mpp_err("failed to dump frame\n");
416*437bfbebSnyanmisaka mpp_mutex_unlock(&p->lock);
417*437bfbebSnyanmisaka return MPP_NOK;
418*437bfbebSnyanmisaka }
419*437bfbebSnyanmisaka
420*437bfbebSnyanmisaka dump_frame(p->fp_out, frame, p->fp_buf, p->dump_width, p->dump_height);
421*437bfbebSnyanmisaka
422*437bfbebSnyanmisaka if (p->debug & MPP_DBG_DUMP_LOG) {
423*437bfbebSnyanmisaka RK_S64 pts = mpp_frame_get_pts(frame);
424*437bfbebSnyanmisaka RK_U32 width = mpp_frame_get_hor_stride(frame);
425*437bfbebSnyanmisaka RK_U32 height = mpp_frame_get_ver_stride(frame);
426*437bfbebSnyanmisaka
427*437bfbebSnyanmisaka mpp_log("yuv_info: [%d:%d] pts %lld", width, height, pts);
428*437bfbebSnyanmisaka }
429*437bfbebSnyanmisaka mpp_mutex_unlock(&p->lock);
430*437bfbebSnyanmisaka
431*437bfbebSnyanmisaka return MPP_OK;
432*437bfbebSnyanmisaka }
433*437bfbebSnyanmisaka
mpp_ops_enc_put_frm(MppDump info,MppFrame frame)434*437bfbebSnyanmisaka MPP_RET mpp_ops_enc_put_frm(MppDump info, MppFrame frame)
435*437bfbebSnyanmisaka {
436*437bfbebSnyanmisaka MppDumpImpl *p = (MppDumpImpl *)info;
437*437bfbebSnyanmisaka
438*437bfbebSnyanmisaka if (NULL == p || NULL == frame || NULL == p->fp_in)
439*437bfbebSnyanmisaka return MPP_OK;
440*437bfbebSnyanmisaka
441*437bfbebSnyanmisaka mpp_mutex_lock(&p->lock);
442*437bfbebSnyanmisaka
443*437bfbebSnyanmisaka dump_frame(p->fp_in, frame, p->fp_buf, p->dump_width, p->dump_height);
444*437bfbebSnyanmisaka
445*437bfbebSnyanmisaka if (p->debug & MPP_DBG_DUMP_LOG) {
446*437bfbebSnyanmisaka RK_S64 pts = mpp_frame_get_pts(frame);
447*437bfbebSnyanmisaka RK_U32 width = mpp_frame_get_hor_stride(frame);
448*437bfbebSnyanmisaka RK_U32 height = mpp_frame_get_ver_stride(frame);
449*437bfbebSnyanmisaka
450*437bfbebSnyanmisaka mpp_log("yuv_info: [%d:%d] pts %lld", width, height, pts);
451*437bfbebSnyanmisaka }
452*437bfbebSnyanmisaka
453*437bfbebSnyanmisaka mpp_mutex_unlock(&p->lock);
454*437bfbebSnyanmisaka
455*437bfbebSnyanmisaka return MPP_OK;
456*437bfbebSnyanmisaka }
457*437bfbebSnyanmisaka
mpp_ops_enc_get_pkt(MppDump info,MppPacket pkt)458*437bfbebSnyanmisaka MPP_RET mpp_ops_enc_get_pkt(MppDump info, MppPacket pkt)
459*437bfbebSnyanmisaka {
460*437bfbebSnyanmisaka MppDumpImpl *p = (MppDumpImpl *)info;
461*437bfbebSnyanmisaka
462*437bfbebSnyanmisaka if (NULL == p || NULL == pkt)
463*437bfbebSnyanmisaka return MPP_OK;
464*437bfbebSnyanmisaka
465*437bfbebSnyanmisaka RK_U32 length = mpp_packet_get_length(pkt);
466*437bfbebSnyanmisaka mpp_mutex_lock(&p->lock);
467*437bfbebSnyanmisaka
468*437bfbebSnyanmisaka if (p->fp_out) {
469*437bfbebSnyanmisaka fwrite(mpp_packet_get_data(pkt), 1, length, p->fp_out);
470*437bfbebSnyanmisaka fflush(p->fp_out);
471*437bfbebSnyanmisaka }
472*437bfbebSnyanmisaka
473*437bfbebSnyanmisaka mpp_mutex_unlock(&p->lock);
474*437bfbebSnyanmisaka
475*437bfbebSnyanmisaka return MPP_OK;
476*437bfbebSnyanmisaka }
477*437bfbebSnyanmisaka
mpp_ops_ctrl(MppDump info,MpiCmd cmd)478*437bfbebSnyanmisaka MPP_RET mpp_ops_ctrl(MppDump info, MpiCmd cmd)
479*437bfbebSnyanmisaka {
480*437bfbebSnyanmisaka MppDumpImpl *p = (MppDumpImpl *)info;
481*437bfbebSnyanmisaka
482*437bfbebSnyanmisaka if (NULL == p)
483*437bfbebSnyanmisaka return MPP_OK;
484*437bfbebSnyanmisaka
485*437bfbebSnyanmisaka mpp_mutex_lock(&p->lock);
486*437bfbebSnyanmisaka
487*437bfbebSnyanmisaka if (p->fp_ops)
488*437bfbebSnyanmisaka ops_log(p->fp_ops, "%d,%s,%d\n", p->idx, "ctrl", cmd);
489*437bfbebSnyanmisaka mpp_mutex_unlock(&p->lock);
490*437bfbebSnyanmisaka
491*437bfbebSnyanmisaka return MPP_OK;
492*437bfbebSnyanmisaka }
493*437bfbebSnyanmisaka
mpp_ops_reset(MppDump info)494*437bfbebSnyanmisaka MPP_RET mpp_ops_reset(MppDump info)
495*437bfbebSnyanmisaka {
496*437bfbebSnyanmisaka MppDumpImpl *p = (MppDumpImpl *)info;
497*437bfbebSnyanmisaka
498*437bfbebSnyanmisaka if (NULL == p)
499*437bfbebSnyanmisaka return MPP_OK;
500*437bfbebSnyanmisaka
501*437bfbebSnyanmisaka mpp_mutex_lock(&p->lock);
502*437bfbebSnyanmisaka
503*437bfbebSnyanmisaka if (p->fp_ops)
504*437bfbebSnyanmisaka ops_log(p->fp_ops, "%d,%s\n", p->idx, "rst");
505*437bfbebSnyanmisaka mpp_mutex_unlock(&p->lock);
506*437bfbebSnyanmisaka
507*437bfbebSnyanmisaka return MPP_OK;
508*437bfbebSnyanmisaka }
509