xref: /rockchip-linux_mpp/mpp/mpp_impl.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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