2 * Copyright (C) 2016 foo86
4 * This file is part of FFmpeg.
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.
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.
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
21 #ifndef AVCODEC_DCADEC_H
22 #define AVCODEC_DCADEC_H
26 #include "libavutil/crc.h"
27 #include "libavutil/float_dsp.h"
28 #include "libavutil/log.h"
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
45 #define DCA_PACKET_RECOVERY 0x10 ///< Sync error recovery flag
46 #define DCA_PACKET_RESIDUAL 0x20 ///< Core valid for residual decoding
48 enum DCAOutputChannelOrder
{
49 CHANNEL_ORDER_DEFAULT
,
53 typedef struct DCAContext
{
54 const AVClass
*class; ///< class for AVOptions
55 AVCodecContext
*avctx
;
57 DCACoreDecoder core
; ///< Core decoder context
58 DCAExssParser exss
; ///< EXSS parser context
59 DCAXllDecoder xll
; ///< XLL decoder context
60 DCALbrDecoder lbr
; ///< LBR decoder context
66 uint8_t *buffer
; ///< Packet buffer
67 unsigned int buffer_size
;
69 int packet
; ///< Packet flags
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
;
77 int ff_dca_set_channel_layout(AVCodecContext
*avctx
, int *ch_remap
, int dca_mask
);
79 void ff_dca_downmix_to_stereo_fixed(DCADSPContext
*dcadsp
, int32_t **samples
,
80 int *coeff_l
, int nsamples
, int ch_mask
);
81 void ff_dca_downmix_to_stereo_float(AVFloatDSPContext
*fdsp
, float **samples
,
82 int *coeff_l
, int nsamples
, int ch_mask
);
84 static inline int ff_dca_check_crc(AVCodecContext
*avctx
, GetBitContext
*s
,
87 DCAContext
*dca
= avctx
->priv_data
;
89 if (!(avctx
->err_recognition
& (AV_EF_CRCCHECK
| AV_EF_CAREFUL
)))
91 if (((p1
| p2
) & 7) || p1
< 0 || p2
> s
->size_in_bits
|| p2
- p1
< 16)
93 if (av_crc(dca
->crctab
, 0xffff, s
->buffer
+ p1
/ 8, (p2
- p1
) / 8))
98 static inline int ff_dca_seek_bits(GetBitContext
*s
, int p
)
100 if (p
< get_bits_count(s
) || p
> s
->size_in_bits
)
102 skip_bits_long(s
, p
- get_bits_count(s
));