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_dec"
7*437bfbebSnyanmisaka
8*437bfbebSnyanmisaka #include <string.h>
9*437bfbebSnyanmisaka
10*437bfbebSnyanmisaka #include "mpp_mem.h"
11*437bfbebSnyanmisaka #include "mpp_log.h"
12*437bfbebSnyanmisaka #include "mpp_common.h"
13*437bfbebSnyanmisaka
14*437bfbebSnyanmisaka #include "mpp_parser.h"
15*437bfbebSnyanmisaka
16*437bfbebSnyanmisaka #include "h263d_api.h"
17*437bfbebSnyanmisaka #include "h264d_api.h"
18*437bfbebSnyanmisaka #include "h265d_api.h"
19*437bfbebSnyanmisaka #include "vp9d_api.h"
20*437bfbebSnyanmisaka #include "avsd_api.h"
21*437bfbebSnyanmisaka #include "avs2d_api.h"
22*437bfbebSnyanmisaka #include "m2vd_api.h"
23*437bfbebSnyanmisaka #include "mpg4d_api.h"
24*437bfbebSnyanmisaka #include "vp8d_api.h"
25*437bfbebSnyanmisaka #include "jpegd_api.h"
26*437bfbebSnyanmisaka #include "av1d_api.h"
27*437bfbebSnyanmisaka
28*437bfbebSnyanmisaka // for test and demo
29*437bfbebSnyanmisaka #include "dummy_dec_api.h"
30*437bfbebSnyanmisaka
31*437bfbebSnyanmisaka /*
32*437bfbebSnyanmisaka * all decoder static register here
33*437bfbebSnyanmisaka */
34*437bfbebSnyanmisaka static const ParserApi *parsers[] = {
35*437bfbebSnyanmisaka #if HAVE_AVSD
36*437bfbebSnyanmisaka &api_avsd_parser,
37*437bfbebSnyanmisaka &api_avsd_plus_parser,
38*437bfbebSnyanmisaka #endif
39*437bfbebSnyanmisaka #if HAVE_AVS2D
40*437bfbebSnyanmisaka &api_avs2d_parser,
41*437bfbebSnyanmisaka #endif
42*437bfbebSnyanmisaka #if HAVE_H263D
43*437bfbebSnyanmisaka &api_h263d_parser,
44*437bfbebSnyanmisaka #endif
45*437bfbebSnyanmisaka #if HAVE_H264D
46*437bfbebSnyanmisaka &api_h264d_parser,
47*437bfbebSnyanmisaka #endif
48*437bfbebSnyanmisaka #if HAVE_H265D
49*437bfbebSnyanmisaka &api_h265d_parser,
50*437bfbebSnyanmisaka #endif
51*437bfbebSnyanmisaka #if HAVE_MPEG2D
52*437bfbebSnyanmisaka &api_m2vd_parser,
53*437bfbebSnyanmisaka #endif
54*437bfbebSnyanmisaka #if HAVE_MPEG4D
55*437bfbebSnyanmisaka &api_mpg4d_parser,
56*437bfbebSnyanmisaka #endif
57*437bfbebSnyanmisaka #if HAVE_VP8D
58*437bfbebSnyanmisaka &api_vp8d_parser,
59*437bfbebSnyanmisaka #endif
60*437bfbebSnyanmisaka #if HAVE_VP9D
61*437bfbebSnyanmisaka &api_vp9d_parser,
62*437bfbebSnyanmisaka #endif
63*437bfbebSnyanmisaka #if HAVE_JPEGD
64*437bfbebSnyanmisaka &api_jpegd_parser,
65*437bfbebSnyanmisaka #endif
66*437bfbebSnyanmisaka &dummy_dec_parser,
67*437bfbebSnyanmisaka #if HAVE_AV1D
68*437bfbebSnyanmisaka &api_av1d_parser,
69*437bfbebSnyanmisaka #endif
70*437bfbebSnyanmisaka };
71*437bfbebSnyanmisaka
72*437bfbebSnyanmisaka typedef struct ParserImpl_t {
73*437bfbebSnyanmisaka const ParserApi *api;
74*437bfbebSnyanmisaka void *ctx;
75*437bfbebSnyanmisaka } ParserImpl;
76*437bfbebSnyanmisaka
mpp_parser_init(Parser * prs,ParserCfg * cfg)77*437bfbebSnyanmisaka MPP_RET mpp_parser_init(Parser *prs, ParserCfg *cfg)
78*437bfbebSnyanmisaka {
79*437bfbebSnyanmisaka if (NULL == prs || NULL == cfg) {
80*437bfbebSnyanmisaka mpp_err_f("found NULL input parser %p config %p\n", prs, cfg);
81*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
82*437bfbebSnyanmisaka }
83*437bfbebSnyanmisaka
84*437bfbebSnyanmisaka *prs = NULL;
85*437bfbebSnyanmisaka
86*437bfbebSnyanmisaka RK_U32 i;
87*437bfbebSnyanmisaka for (i = 0; i < MPP_ARRAY_ELEMS(parsers); i++) {
88*437bfbebSnyanmisaka const ParserApi *api = parsers[i];
89*437bfbebSnyanmisaka if (cfg->coding == api->coding) {
90*437bfbebSnyanmisaka ParserImpl *p = mpp_calloc(ParserImpl, 1);
91*437bfbebSnyanmisaka void *ctx = mpp_calloc_size(void, api->ctx_size);
92*437bfbebSnyanmisaka if (NULL == ctx || NULL == p) {
93*437bfbebSnyanmisaka mpp_err_f("failed to alloc parser context\n");
94*437bfbebSnyanmisaka mpp_free(p);
95*437bfbebSnyanmisaka mpp_free(ctx);
96*437bfbebSnyanmisaka return MPP_ERR_MALLOC;
97*437bfbebSnyanmisaka }
98*437bfbebSnyanmisaka
99*437bfbebSnyanmisaka MPP_RET ret = api->init(ctx, cfg);
100*437bfbebSnyanmisaka if (MPP_OK != ret) {
101*437bfbebSnyanmisaka mpp_err_f("failed to init parser\n");
102*437bfbebSnyanmisaka mpp_free(p);
103*437bfbebSnyanmisaka mpp_free(ctx);
104*437bfbebSnyanmisaka return ret;
105*437bfbebSnyanmisaka }
106*437bfbebSnyanmisaka
107*437bfbebSnyanmisaka p->api = api;
108*437bfbebSnyanmisaka p->ctx = ctx;
109*437bfbebSnyanmisaka *prs = p;
110*437bfbebSnyanmisaka return MPP_OK;
111*437bfbebSnyanmisaka }
112*437bfbebSnyanmisaka }
113*437bfbebSnyanmisaka return MPP_NOK;
114*437bfbebSnyanmisaka }
115*437bfbebSnyanmisaka
mpp_parser_deinit(Parser prs)116*437bfbebSnyanmisaka MPP_RET mpp_parser_deinit(Parser prs)
117*437bfbebSnyanmisaka {
118*437bfbebSnyanmisaka if (NULL == prs) {
119*437bfbebSnyanmisaka mpp_err_f("found NULL input\n");
120*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
121*437bfbebSnyanmisaka }
122*437bfbebSnyanmisaka
123*437bfbebSnyanmisaka ParserImpl *p = (ParserImpl *)prs;
124*437bfbebSnyanmisaka if (p->api->deinit)
125*437bfbebSnyanmisaka p->api->deinit(p->ctx);
126*437bfbebSnyanmisaka
127*437bfbebSnyanmisaka mpp_free(p->ctx);
128*437bfbebSnyanmisaka mpp_free(p);
129*437bfbebSnyanmisaka return MPP_OK;
130*437bfbebSnyanmisaka }
131*437bfbebSnyanmisaka
mpp_parser_prepare(Parser prs,MppPacket pkt,HalDecTask * task)132*437bfbebSnyanmisaka MPP_RET mpp_parser_prepare(Parser prs, MppPacket pkt, HalDecTask *task)
133*437bfbebSnyanmisaka {
134*437bfbebSnyanmisaka if (NULL == prs || NULL == pkt) {
135*437bfbebSnyanmisaka mpp_err_f("found NULL input\n");
136*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
137*437bfbebSnyanmisaka }
138*437bfbebSnyanmisaka
139*437bfbebSnyanmisaka ParserImpl *p = (ParserImpl *)prs;
140*437bfbebSnyanmisaka if (!p->api->prepare)
141*437bfbebSnyanmisaka return MPP_OK;
142*437bfbebSnyanmisaka
143*437bfbebSnyanmisaka return p->api->prepare(p->ctx, pkt, task);
144*437bfbebSnyanmisaka }
145*437bfbebSnyanmisaka
mpp_parser_parse(Parser prs,HalDecTask * task)146*437bfbebSnyanmisaka MPP_RET mpp_parser_parse(Parser prs, HalDecTask *task)
147*437bfbebSnyanmisaka {
148*437bfbebSnyanmisaka if (NULL == prs || NULL == task) {
149*437bfbebSnyanmisaka mpp_err_f("found NULL input\n");
150*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
151*437bfbebSnyanmisaka }
152*437bfbebSnyanmisaka
153*437bfbebSnyanmisaka ParserImpl *p = (ParserImpl *)prs;
154*437bfbebSnyanmisaka if (!p->api->parse)
155*437bfbebSnyanmisaka return MPP_OK;
156*437bfbebSnyanmisaka
157*437bfbebSnyanmisaka return p->api->parse(p->ctx, task);
158*437bfbebSnyanmisaka }
159*437bfbebSnyanmisaka
mpp_parser_callback(void * prs,void * err_info)160*437bfbebSnyanmisaka MPP_RET mpp_parser_callback(void *prs, void *err_info)
161*437bfbebSnyanmisaka {
162*437bfbebSnyanmisaka if (NULL == prs) {
163*437bfbebSnyanmisaka mpp_err_f("found NULL input\n");
164*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
165*437bfbebSnyanmisaka }
166*437bfbebSnyanmisaka ParserImpl *p = (ParserImpl *)prs;
167*437bfbebSnyanmisaka if (!p->api->callback)
168*437bfbebSnyanmisaka return MPP_OK;
169*437bfbebSnyanmisaka return p->api->callback(p->ctx, err_info);
170*437bfbebSnyanmisaka }
171*437bfbebSnyanmisaka
mpp_parser_reset(Parser prs)172*437bfbebSnyanmisaka MPP_RET mpp_parser_reset(Parser prs)
173*437bfbebSnyanmisaka {
174*437bfbebSnyanmisaka if (NULL == prs) {
175*437bfbebSnyanmisaka mpp_err_f("found NULL input\n");
176*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
177*437bfbebSnyanmisaka }
178*437bfbebSnyanmisaka
179*437bfbebSnyanmisaka ParserImpl *p = (ParserImpl *)prs;
180*437bfbebSnyanmisaka if (!p->api->reset)
181*437bfbebSnyanmisaka return MPP_OK;
182*437bfbebSnyanmisaka
183*437bfbebSnyanmisaka return p->api->reset(p->ctx);
184*437bfbebSnyanmisaka }
185*437bfbebSnyanmisaka
mpp_parser_flush(Parser prs)186*437bfbebSnyanmisaka MPP_RET mpp_parser_flush(Parser prs)
187*437bfbebSnyanmisaka {
188*437bfbebSnyanmisaka if (NULL == prs) {
189*437bfbebSnyanmisaka mpp_err_f("found NULL input\n");
190*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
191*437bfbebSnyanmisaka }
192*437bfbebSnyanmisaka
193*437bfbebSnyanmisaka ParserImpl *p = (ParserImpl *)prs;
194*437bfbebSnyanmisaka if (!p->api->flush)
195*437bfbebSnyanmisaka return MPP_OK;
196*437bfbebSnyanmisaka
197*437bfbebSnyanmisaka return p->api->flush(p->ctx);
198*437bfbebSnyanmisaka }
199*437bfbebSnyanmisaka
mpp_parser_control(Parser prs,MpiCmd cmd,void * para)200*437bfbebSnyanmisaka MPP_RET mpp_parser_control(Parser prs, MpiCmd cmd, void *para)
201*437bfbebSnyanmisaka {
202*437bfbebSnyanmisaka if (NULL == prs) {
203*437bfbebSnyanmisaka mpp_err_f("found NULL input\n");
204*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
205*437bfbebSnyanmisaka }
206*437bfbebSnyanmisaka
207*437bfbebSnyanmisaka ParserImpl *p = (ParserImpl *)prs;
208*437bfbebSnyanmisaka if (!p->api->control)
209*437bfbebSnyanmisaka return MPP_OK;
210*437bfbebSnyanmisaka
211*437bfbebSnyanmisaka return p->api->control(p->ctx, cmd, para);
212*437bfbebSnyanmisaka }
213*437bfbebSnyanmisaka
214