1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Musepack SV7 decoder
3cabdff1aSopenharmony_ci * Copyright (c) 2006 Konstantin Shishkov
4cabdff1aSopenharmony_ci *
5cabdff1aSopenharmony_ci * This file is part of FFmpeg.
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
11cabdff1aSopenharmony_ci *
12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15cabdff1aSopenharmony_ci * Lesser General Public License for more details.
16cabdff1aSopenharmony_ci *
17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20cabdff1aSopenharmony_ci */
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci/**
23cabdff1aSopenharmony_ci * @file
24cabdff1aSopenharmony_ci * MPEG Audio Layer 1/2 -like codec with frames of 1152 samples
25cabdff1aSopenharmony_ci * divided into 32 subbands.
26cabdff1aSopenharmony_ci */
27cabdff1aSopenharmony_ci
28cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h"
29cabdff1aSopenharmony_ci#include "libavutil/internal.h"
30cabdff1aSopenharmony_ci#include "libavutil/lfg.h"
31cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h"
32cabdff1aSopenharmony_ci#include "libavutil/thread.h"
33cabdff1aSopenharmony_ci
34cabdff1aSopenharmony_ci#include "avcodec.h"
35cabdff1aSopenharmony_ci#include "codec_internal.h"
36cabdff1aSopenharmony_ci#include "get_bits.h"
37cabdff1aSopenharmony_ci#include "internal.h"
38cabdff1aSopenharmony_ci#include "mpegaudiodsp.h"
39cabdff1aSopenharmony_ci
40cabdff1aSopenharmony_ci#include "mpc.h"
41cabdff1aSopenharmony_ci#include "mpc7data.h"
42cabdff1aSopenharmony_ci
43cabdff1aSopenharmony_cistatic VLC scfi_vlc, dscf_vlc, hdr_vlc, quant_vlc[MPC7_QUANT_VLC_TABLES][2];
44cabdff1aSopenharmony_ci
45cabdff1aSopenharmony_cistatic av_cold void mpc7_init_static(void)
46cabdff1aSopenharmony_ci{
47cabdff1aSopenharmony_ci    static VLCElem quant_tables[7224];
48cabdff1aSopenharmony_ci    const uint8_t *raw_quant_table = mpc7_quant_vlcs;
49cabdff1aSopenharmony_ci
50cabdff1aSopenharmony_ci    INIT_VLC_STATIC_FROM_LENGTHS(&scfi_vlc, MPC7_SCFI_BITS, MPC7_SCFI_SIZE,
51cabdff1aSopenharmony_ci                                 &mpc7_scfi[1], 2,
52cabdff1aSopenharmony_ci                                 &mpc7_scfi[0], 2, 1, 0, 0, 1 << MPC7_SCFI_BITS);
53cabdff1aSopenharmony_ci    INIT_VLC_STATIC_FROM_LENGTHS(&dscf_vlc, MPC7_DSCF_BITS, MPC7_DSCF_SIZE,
54cabdff1aSopenharmony_ci                                 &mpc7_dscf[1], 2,
55cabdff1aSopenharmony_ci                                 &mpc7_dscf[0], 2, 1, -7, 0, 1 << MPC7_DSCF_BITS);
56cabdff1aSopenharmony_ci    INIT_VLC_STATIC_FROM_LENGTHS(&hdr_vlc, MPC7_HDR_BITS, MPC7_HDR_SIZE,
57cabdff1aSopenharmony_ci                                 &mpc7_hdr[1], 2,
58cabdff1aSopenharmony_ci                                 &mpc7_hdr[0], 2, 1, -5, 0, 1 << MPC7_HDR_BITS);
59cabdff1aSopenharmony_ci    for (unsigned i = 0, offset = 0; i < MPC7_QUANT_VLC_TABLES; i++){
60cabdff1aSopenharmony_ci        for (int j = 0; j < 2; j++) {
61cabdff1aSopenharmony_ci            quant_vlc[i][j].table           = &quant_tables[offset];
62cabdff1aSopenharmony_ci            quant_vlc[i][j].table_allocated = FF_ARRAY_ELEMS(quant_tables) - offset;
63cabdff1aSopenharmony_ci            ff_init_vlc_from_lengths(&quant_vlc[i][j], 9, mpc7_quant_vlc_sizes[i],
64cabdff1aSopenharmony_ci                                     &raw_quant_table[1], 2,
65cabdff1aSopenharmony_ci                                     &raw_quant_table[0], 2, 1,
66cabdff1aSopenharmony_ci                                     mpc7_quant_vlc_off[i],
67cabdff1aSopenharmony_ci                                     INIT_VLC_STATIC_OVERLONG, NULL);
68cabdff1aSopenharmony_ci            raw_quant_table += 2 * mpc7_quant_vlc_sizes[i];
69cabdff1aSopenharmony_ci            offset          += quant_vlc[i][j].table_size;
70cabdff1aSopenharmony_ci        }
71cabdff1aSopenharmony_ci    }
72cabdff1aSopenharmony_ci    ff_mpa_synth_init_fixed();
73cabdff1aSopenharmony_ci}
74cabdff1aSopenharmony_ci
75cabdff1aSopenharmony_cistatic av_cold int mpc7_decode_init(AVCodecContext * avctx)
76cabdff1aSopenharmony_ci{
77cabdff1aSopenharmony_ci    static AVOnce init_static_once = AV_ONCE_INIT;
78cabdff1aSopenharmony_ci    MPCContext *c = avctx->priv_data;
79cabdff1aSopenharmony_ci    GetBitContext gb;
80cabdff1aSopenharmony_ci    LOCAL_ALIGNED_16(uint8_t, buf, [16]);
81cabdff1aSopenharmony_ci
82cabdff1aSopenharmony_ci    /* Musepack SV7 is always stereo */
83cabdff1aSopenharmony_ci    if (avctx->ch_layout.nb_channels != 2) {
84cabdff1aSopenharmony_ci        avpriv_request_sample(avctx, "%d channels", avctx->ch_layout.nb_channels);
85cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
86cabdff1aSopenharmony_ci    }
87cabdff1aSopenharmony_ci
88cabdff1aSopenharmony_ci    if(avctx->extradata_size < 16){
89cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Too small extradata size (%i)!\n", avctx->extradata_size);
90cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
91cabdff1aSopenharmony_ci    }
92cabdff1aSopenharmony_ci    memset(c->oldDSCF, 0, sizeof(c->oldDSCF));
93cabdff1aSopenharmony_ci    av_lfg_init(&c->rnd, 0xDEADBEEF);
94cabdff1aSopenharmony_ci    ff_bswapdsp_init(&c->bdsp);
95cabdff1aSopenharmony_ci    ff_mpadsp_init(&c->mpadsp);
96cabdff1aSopenharmony_ci    c->bdsp.bswap_buf((uint32_t *) buf, (const uint32_t *) avctx->extradata, 4);
97cabdff1aSopenharmony_ci    init_get_bits(&gb, buf, 128);
98cabdff1aSopenharmony_ci
99cabdff1aSopenharmony_ci    c->IS = get_bits1(&gb);
100cabdff1aSopenharmony_ci    c->MSS = get_bits1(&gb);
101cabdff1aSopenharmony_ci    c->maxbands = get_bits(&gb, 6);
102cabdff1aSopenharmony_ci    if(c->maxbands >= BANDS){
103cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Too many bands: %i\n", c->maxbands);
104cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
105cabdff1aSopenharmony_ci    }
106cabdff1aSopenharmony_ci    skip_bits_long(&gb, 88);
107cabdff1aSopenharmony_ci    c->gapless = get_bits1(&gb);
108cabdff1aSopenharmony_ci    c->lastframelen = get_bits(&gb, 11);
109cabdff1aSopenharmony_ci    av_log(avctx, AV_LOG_DEBUG, "IS: %d, MSS: %d, TG: %d, LFL: %d, bands: %d\n",
110cabdff1aSopenharmony_ci            c->IS, c->MSS, c->gapless, c->lastframelen, c->maxbands);
111cabdff1aSopenharmony_ci    c->frames_to_skip = 0;
112cabdff1aSopenharmony_ci
113cabdff1aSopenharmony_ci    avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
114cabdff1aSopenharmony_ci    av_channel_layout_uninit(&avctx->ch_layout);
115cabdff1aSopenharmony_ci    avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO;
116cabdff1aSopenharmony_ci
117cabdff1aSopenharmony_ci    ff_thread_once(&init_static_once, mpc7_init_static);
118cabdff1aSopenharmony_ci
119cabdff1aSopenharmony_ci    return 0;
120cabdff1aSopenharmony_ci}
121cabdff1aSopenharmony_ci
122cabdff1aSopenharmony_ci/**
123cabdff1aSopenharmony_ci * Fill samples for given subband
124cabdff1aSopenharmony_ci */
125cabdff1aSopenharmony_cistatic inline void idx_to_quant(MPCContext *c, GetBitContext *gb, int idx, int *dst)
126cabdff1aSopenharmony_ci{
127cabdff1aSopenharmony_ci    int i, i1, t;
128cabdff1aSopenharmony_ci    switch(idx){
129cabdff1aSopenharmony_ci    case -1:
130cabdff1aSopenharmony_ci        for(i = 0; i < SAMPLES_PER_BAND; i++){
131cabdff1aSopenharmony_ci            *dst++ = (av_lfg_get(&c->rnd) & 0x3FC) - 510;
132cabdff1aSopenharmony_ci        }
133cabdff1aSopenharmony_ci        break;
134cabdff1aSopenharmony_ci    case 1:
135cabdff1aSopenharmony_ci        i1 = get_bits1(gb);
136cabdff1aSopenharmony_ci        for(i = 0; i < SAMPLES_PER_BAND/3; i++){
137cabdff1aSopenharmony_ci            t = get_vlc2(gb, quant_vlc[0][i1].table, 9, 2);
138cabdff1aSopenharmony_ci            *dst++ = mpc7_idx30[t];
139cabdff1aSopenharmony_ci            *dst++ = mpc7_idx31[t];
140cabdff1aSopenharmony_ci            *dst++ = mpc7_idx32[t];
141cabdff1aSopenharmony_ci        }
142cabdff1aSopenharmony_ci        break;
143cabdff1aSopenharmony_ci    case 2:
144cabdff1aSopenharmony_ci        i1 = get_bits1(gb);
145cabdff1aSopenharmony_ci        for(i = 0; i < SAMPLES_PER_BAND/2; i++){
146cabdff1aSopenharmony_ci            t = get_vlc2(gb, quant_vlc[1][i1].table, 9, 2);
147cabdff1aSopenharmony_ci            *dst++ = mpc7_idx50[t];
148cabdff1aSopenharmony_ci            *dst++ = mpc7_idx51[t];
149cabdff1aSopenharmony_ci        }
150cabdff1aSopenharmony_ci        break;
151cabdff1aSopenharmony_ci    case  3: case  4: case  5: case  6: case  7:
152cabdff1aSopenharmony_ci        i1 = get_bits1(gb);
153cabdff1aSopenharmony_ci        for(i = 0; i < SAMPLES_PER_BAND; i++)
154cabdff1aSopenharmony_ci            *dst++ = get_vlc2(gb, quant_vlc[idx-1][i1].table, 9, 2);
155cabdff1aSopenharmony_ci        break;
156cabdff1aSopenharmony_ci    case  8: case  9: case 10: case 11: case 12:
157cabdff1aSopenharmony_ci    case 13: case 14: case 15: case 16: case 17:
158cabdff1aSopenharmony_ci        t = (1 << (idx - 2)) - 1;
159cabdff1aSopenharmony_ci        for(i = 0; i < SAMPLES_PER_BAND; i++)
160cabdff1aSopenharmony_ci            *dst++ = get_bits(gb, idx - 1) - t;
161cabdff1aSopenharmony_ci        break;
162cabdff1aSopenharmony_ci    default: // case 0 and -2..-17
163cabdff1aSopenharmony_ci        return;
164cabdff1aSopenharmony_ci    }
165cabdff1aSopenharmony_ci}
166cabdff1aSopenharmony_ci
167cabdff1aSopenharmony_cistatic int get_scale_idx(GetBitContext *gb, int ref)
168cabdff1aSopenharmony_ci{
169cabdff1aSopenharmony_ci    int t = get_vlc2(gb, dscf_vlc.table, MPC7_DSCF_BITS, 1);
170cabdff1aSopenharmony_ci    if (t == 8)
171cabdff1aSopenharmony_ci        return get_bits(gb, 6);
172cabdff1aSopenharmony_ci    return ref + t;
173cabdff1aSopenharmony_ci}
174cabdff1aSopenharmony_ci
175cabdff1aSopenharmony_cistatic int mpc7_decode_frame(AVCodecContext *avctx, AVFrame *frame,
176cabdff1aSopenharmony_ci                             int *got_frame_ptr, AVPacket *avpkt)
177cabdff1aSopenharmony_ci{
178cabdff1aSopenharmony_ci    const uint8_t *buf = avpkt->data;
179cabdff1aSopenharmony_ci    int buf_size;
180cabdff1aSopenharmony_ci    MPCContext *c = avctx->priv_data;
181cabdff1aSopenharmony_ci    GetBitContext gb;
182cabdff1aSopenharmony_ci    int i, ch;
183cabdff1aSopenharmony_ci    int mb = -1;
184cabdff1aSopenharmony_ci    Band *bands = c->bands;
185cabdff1aSopenharmony_ci    int off, ret, last_frame, skip;
186cabdff1aSopenharmony_ci    int bits_used, bits_avail;
187cabdff1aSopenharmony_ci
188cabdff1aSopenharmony_ci    memset(bands, 0, sizeof(*bands) * (c->maxbands + 1));
189cabdff1aSopenharmony_ci
190cabdff1aSopenharmony_ci    buf_size = avpkt->size & ~3;
191cabdff1aSopenharmony_ci    if (buf_size <= 0) {
192cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "packet size is too small (%i bytes)\n",
193cabdff1aSopenharmony_ci               avpkt->size);
194cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
195cabdff1aSopenharmony_ci    }
196cabdff1aSopenharmony_ci    if (buf_size != avpkt->size) {
197cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_WARNING, "packet size is not a multiple of 4. "
198cabdff1aSopenharmony_ci               "extra bytes at the end will be skipped.\n");
199cabdff1aSopenharmony_ci    }
200cabdff1aSopenharmony_ci
201cabdff1aSopenharmony_ci    skip       = buf[0];
202cabdff1aSopenharmony_ci    last_frame = buf[1];
203cabdff1aSopenharmony_ci    buf       += 4;
204cabdff1aSopenharmony_ci    buf_size  -= 4;
205cabdff1aSopenharmony_ci
206cabdff1aSopenharmony_ci    /* get output buffer */
207cabdff1aSopenharmony_ci    frame->nb_samples = MPC_FRAME_SIZE;
208cabdff1aSopenharmony_ci    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
209cabdff1aSopenharmony_ci        return ret;
210cabdff1aSopenharmony_ci
211cabdff1aSopenharmony_ci    av_fast_padded_malloc(&c->bits, &c->buf_size, buf_size);
212cabdff1aSopenharmony_ci    if (!c->bits)
213cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
214cabdff1aSopenharmony_ci    c->bdsp.bswap_buf((uint32_t *) c->bits, (const uint32_t *) buf,
215cabdff1aSopenharmony_ci                      buf_size >> 2);
216cabdff1aSopenharmony_ci    if ((ret = init_get_bits8(&gb, c->bits, buf_size)) < 0)
217cabdff1aSopenharmony_ci        return ret;
218cabdff1aSopenharmony_ci    skip_bits_long(&gb, skip);
219cabdff1aSopenharmony_ci
220cabdff1aSopenharmony_ci    /* read subband indexes */
221cabdff1aSopenharmony_ci    for(i = 0; i <= c->maxbands; i++){
222cabdff1aSopenharmony_ci        for(ch = 0; ch < 2; ch++){
223cabdff1aSopenharmony_ci            int t = i ? get_vlc2(&gb, hdr_vlc.table, MPC7_HDR_BITS, 1) : 4;
224cabdff1aSopenharmony_ci            if(t == 4) bands[i].res[ch] = get_bits(&gb, 4);
225cabdff1aSopenharmony_ci            else bands[i].res[ch] = bands[i-1].res[ch] + t;
226cabdff1aSopenharmony_ci            if (bands[i].res[ch] < -1 || bands[i].res[ch] > 17) {
227cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "subband index invalid\n");
228cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
229cabdff1aSopenharmony_ci            }
230cabdff1aSopenharmony_ci        }
231cabdff1aSopenharmony_ci
232cabdff1aSopenharmony_ci        if(bands[i].res[0] || bands[i].res[1]){
233cabdff1aSopenharmony_ci            mb = i;
234cabdff1aSopenharmony_ci            if(c->MSS) bands[i].msf = get_bits1(&gb);
235cabdff1aSopenharmony_ci        }
236cabdff1aSopenharmony_ci    }
237cabdff1aSopenharmony_ci    /* get scale indexes coding method */
238cabdff1aSopenharmony_ci    for(i = 0; i <= mb; i++)
239cabdff1aSopenharmony_ci        for(ch = 0; ch < 2; ch++)
240cabdff1aSopenharmony_ci            if(bands[i].res[ch]) bands[i].scfi[ch] = get_vlc2(&gb, scfi_vlc.table, MPC7_SCFI_BITS, 1);
241cabdff1aSopenharmony_ci    /* get scale indexes */
242cabdff1aSopenharmony_ci    for(i = 0; i <= mb; i++){
243cabdff1aSopenharmony_ci        for(ch = 0; ch < 2; ch++){
244cabdff1aSopenharmony_ci            if(bands[i].res[ch]){
245cabdff1aSopenharmony_ci                bands[i].scf_idx[ch][2] = c->oldDSCF[ch][i];
246cabdff1aSopenharmony_ci                bands[i].scf_idx[ch][0] = get_scale_idx(&gb, bands[i].scf_idx[ch][2]);
247cabdff1aSopenharmony_ci                switch(bands[i].scfi[ch]){
248cabdff1aSopenharmony_ci                case 0:
249cabdff1aSopenharmony_ci                    bands[i].scf_idx[ch][1] = get_scale_idx(&gb, bands[i].scf_idx[ch][0]);
250cabdff1aSopenharmony_ci                    bands[i].scf_idx[ch][2] = get_scale_idx(&gb, bands[i].scf_idx[ch][1]);
251cabdff1aSopenharmony_ci                    break;
252cabdff1aSopenharmony_ci                case 1:
253cabdff1aSopenharmony_ci                    bands[i].scf_idx[ch][1] = get_scale_idx(&gb, bands[i].scf_idx[ch][0]);
254cabdff1aSopenharmony_ci                    bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1];
255cabdff1aSopenharmony_ci                    break;
256cabdff1aSopenharmony_ci                case 2:
257cabdff1aSopenharmony_ci                    bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0];
258cabdff1aSopenharmony_ci                    bands[i].scf_idx[ch][2] = get_scale_idx(&gb, bands[i].scf_idx[ch][1]);
259cabdff1aSopenharmony_ci                    break;
260cabdff1aSopenharmony_ci                case 3:
261cabdff1aSopenharmony_ci                    bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0];
262cabdff1aSopenharmony_ci                    break;
263cabdff1aSopenharmony_ci                }
264cabdff1aSopenharmony_ci                c->oldDSCF[ch][i] = bands[i].scf_idx[ch][2];
265cabdff1aSopenharmony_ci            }
266cabdff1aSopenharmony_ci        }
267cabdff1aSopenharmony_ci    }
268cabdff1aSopenharmony_ci    /* get quantizers */
269cabdff1aSopenharmony_ci    memset(c->Q, 0, sizeof(c->Q));
270cabdff1aSopenharmony_ci    off = 0;
271cabdff1aSopenharmony_ci    for(i = 0; i < BANDS; i++, off += SAMPLES_PER_BAND)
272cabdff1aSopenharmony_ci        for(ch = 0; ch < 2; ch++)
273cabdff1aSopenharmony_ci            idx_to_quant(c, &gb, bands[i].res[ch], c->Q[ch] + off);
274cabdff1aSopenharmony_ci
275cabdff1aSopenharmony_ci    ff_mpc_dequantize_and_synth(c, mb, (int16_t **)frame->extended_data, 2);
276cabdff1aSopenharmony_ci    if(last_frame)
277cabdff1aSopenharmony_ci        frame->nb_samples = c->lastframelen;
278cabdff1aSopenharmony_ci
279cabdff1aSopenharmony_ci    bits_used = get_bits_count(&gb);
280cabdff1aSopenharmony_ci    bits_avail = buf_size * 8;
281cabdff1aSopenharmony_ci    if (!last_frame && ((bits_avail < bits_used) || (bits_used + 32 <= bits_avail))) {
282cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Error decoding frame: used %i of %i bits\n", bits_used, bits_avail);
283cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
284cabdff1aSopenharmony_ci    }
285cabdff1aSopenharmony_ci    if(c->frames_to_skip){
286cabdff1aSopenharmony_ci        c->frames_to_skip--;
287cabdff1aSopenharmony_ci        *got_frame_ptr = 0;
288cabdff1aSopenharmony_ci        return avpkt->size;
289cabdff1aSopenharmony_ci    }
290cabdff1aSopenharmony_ci
291cabdff1aSopenharmony_ci    *got_frame_ptr = 1;
292cabdff1aSopenharmony_ci
293cabdff1aSopenharmony_ci    return avpkt->size;
294cabdff1aSopenharmony_ci}
295cabdff1aSopenharmony_ci
296cabdff1aSopenharmony_cistatic void mpc7_decode_flush(AVCodecContext *avctx)
297cabdff1aSopenharmony_ci{
298cabdff1aSopenharmony_ci    MPCContext *c = avctx->priv_data;
299cabdff1aSopenharmony_ci
300cabdff1aSopenharmony_ci    memset(c->oldDSCF, 0, sizeof(c->oldDSCF));
301cabdff1aSopenharmony_ci    c->frames_to_skip = 32;
302cabdff1aSopenharmony_ci}
303cabdff1aSopenharmony_ci
304cabdff1aSopenharmony_cistatic av_cold int mpc7_decode_close(AVCodecContext *avctx)
305cabdff1aSopenharmony_ci{
306cabdff1aSopenharmony_ci    MPCContext *c = avctx->priv_data;
307cabdff1aSopenharmony_ci    av_freep(&c->bits);
308cabdff1aSopenharmony_ci    c->buf_size = 0;
309cabdff1aSopenharmony_ci    return 0;
310cabdff1aSopenharmony_ci}
311cabdff1aSopenharmony_ci
312cabdff1aSopenharmony_ciconst FFCodec ff_mpc7_decoder = {
313cabdff1aSopenharmony_ci    .p.name         = "mpc7",
314cabdff1aSopenharmony_ci    .p.long_name    = NULL_IF_CONFIG_SMALL("Musepack SV7"),
315cabdff1aSopenharmony_ci    .p.type         = AVMEDIA_TYPE_AUDIO,
316cabdff1aSopenharmony_ci    .p.id           = AV_CODEC_ID_MUSEPACK7,
317cabdff1aSopenharmony_ci    .priv_data_size = sizeof(MPCContext),
318cabdff1aSopenharmony_ci    .init           = mpc7_decode_init,
319cabdff1aSopenharmony_ci    .close          = mpc7_decode_close,
320cabdff1aSopenharmony_ci    FF_CODEC_DECODE_CB(mpc7_decode_frame),
321cabdff1aSopenharmony_ci    .flush          = mpc7_decode_flush,
322cabdff1aSopenharmony_ci    .p.capabilities = AV_CODEC_CAP_DR1,
323cabdff1aSopenharmony_ci    .p.sample_fmts  = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
324cabdff1aSopenharmony_ci                                                      AV_SAMPLE_FMT_NONE },
325cabdff1aSopenharmony_ci    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
326cabdff1aSopenharmony_ci};
327