xref: /third_party/ffmpeg/libavcodec/dcadec.h (revision cabdff1a)
1/*
2 * Copyright (C) 2016 foo86
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#ifndef AVCODEC_DCADEC_H
22#define AVCODEC_DCADEC_H
23
24#include <stdint.h>
25
26#include "libavutil/crc.h"
27#include "libavutil/float_dsp.h"
28#include "libavutil/log.h"
29
30#include "avcodec.h"
31#include "get_bits.h"
32#include "dca.h"
33#include "dcadsp.h"
34#include "dca_core.h"
35#include "dca_exss.h"
36#include "dca_xll.h"
37#include "dca_lbr.h"
38
39#define DCA_PACKET_CORE         0x01
40#define DCA_PACKET_EXSS         0x02
41#define DCA_PACKET_XLL          0x04
42#define DCA_PACKET_LBR          0x08
43#define DCA_PACKET_MASK         0x0f
44
45#define DCA_PACKET_RECOVERY     0x10    ///< Sync error recovery flag
46#define DCA_PACKET_RESIDUAL     0x20    ///< Core valid for residual decoding
47
48enum DCAOutputChannelOrder {
49    CHANNEL_ORDER_DEFAULT,
50    CHANNEL_ORDER_CODED,
51};
52
53typedef struct DCAContext {
54    const AVClass   *class;       ///< class for AVOptions
55    AVCodecContext  *avctx;
56
57    DCACoreDecoder core;  ///< Core decoder context
58    DCAExssParser  exss;  ///< EXSS parser context
59    DCAXllDecoder  xll;   ///< XLL decoder context
60    DCALbrDecoder  lbr;   ///< LBR decoder context
61
62    DCADSPContext   dcadsp;
63
64    const AVCRC     *crctab;
65
66    uint8_t         *buffer;    ///< Packet buffer
67    unsigned int    buffer_size;
68
69    int     packet; ///< Packet flags
70
71    int     request_channel_layout; ///< Converted from avctx.request_channel_layout
72    int     core_only;              ///< Core only decoding flag
73    int     output_channel_order;
74    AVChannelLayout downmix_layout;
75} DCAContext;
76
77int ff_dca_set_channel_layout(AVCodecContext *avctx, int *ch_remap, int dca_mask);
78
79void ff_dca_downmix_to_stereo_fixed(DCADSPContext *dcadsp, int32_t **samples,
80                                    int *coeff_l, int nsamples, int ch_mask);
81void ff_dca_downmix_to_stereo_float(AVFloatDSPContext *fdsp, float **samples,
82                                    int *coeff_l, int nsamples, int ch_mask);
83
84static inline int ff_dca_check_crc(AVCodecContext *avctx, GetBitContext *s,
85                                   int p1, int p2)
86{
87    DCAContext *dca = avctx->priv_data;
88
89    if (!(avctx->err_recognition & (AV_EF_CRCCHECK | AV_EF_CAREFUL)))
90        return 0;
91    if (((p1 | p2) & 7) || p1 < 0 || p2 > s->size_in_bits || p2 - p1 < 16)
92        return -1;
93    if (av_crc(dca->crctab, 0xffff, s->buffer + p1 / 8, (p2 - p1) / 8))
94        return -1;
95    return 0;
96}
97
98static inline int ff_dca_seek_bits(GetBitContext *s, int p)
99{
100    if (p < get_bits_count(s) || p > s->size_in_bits)
101        return -1;
102    skip_bits_long(s, p - get_bits_count(s));
103    return 0;
104}
105
106#endif
107