FFmpeg
Loading...
Searching...
No Matches
libavcodec
bsf
eac3_core.c
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2018 Paul B Mahol
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
#include "
libavcodec/bsf.h
"
22
#include "
libavcodec/bsf_internal.h
"
23
#include "
libavcodec/get_bits.h
"
24
#include "
libavcodec/ac3_parser_internal.h
"
25
26
static
int
eac3_core_init
(
AVBSFContext
*
ctx
)
27
{
28
ctx
->par_out->profile =
AV_PROFILE_UNKNOWN
;
29
30
return
0;
31
}
32
33
static
int
eac3_core_filter
(
AVBSFContext
*
ctx
,
AVPacket
*
pkt
)
34
{
35
AC3HeaderInfo
hdr;
36
GetBitContext
gbc;
37
int
ret;
38
39
ret =
ff_bsf_get_packet_ref
(
ctx
,
pkt
);
40
if
(ret < 0)
41
return
ret;
42
ret =
init_get_bits8
(&gbc,
pkt
->data,
pkt
->size);
43
if
(ret < 0)
44
goto
fail
;
45
46
ret =
ff_ac3_parse_header
(&gbc, &hdr);
47
if
(ret < 0) {
48
ret =
AVERROR_INVALIDDATA
;
49
goto
fail
;
50
}
51
52
if
(hdr.
frame_type
==
EAC3_FRAME_TYPE_INDEPENDENT
||
53
hdr.
frame_type
==
EAC3_FRAME_TYPE_AC3_CONVERT
) {
54
pkt
->size =
FFMIN
(hdr.
frame_size
,
pkt
->size);
55
}
else
if
(hdr.
frame_type
==
EAC3_FRAME_TYPE_DEPENDENT
&&
pkt
->size > hdr.
frame_size
) {
56
AC3HeaderInfo
hdr2;
57
58
ret =
init_get_bits8
(&gbc,
pkt
->data + hdr.
frame_size
,
pkt
->size - hdr.
frame_size
);
59
if
(ret < 0)
60
goto
fail
;
61
62
ret =
ff_ac3_parse_header
(&gbc, &hdr2);
63
if
(ret < 0) {
64
ret =
AVERROR_INVALIDDATA
;
65
goto
fail
;
66
}
67
68
if
(hdr2.
frame_type
==
EAC3_FRAME_TYPE_INDEPENDENT
||
69
hdr2.
frame_type
==
EAC3_FRAME_TYPE_AC3_CONVERT
) {
70
pkt
->size -= hdr.
frame_size
;
71
pkt
->data += hdr.
frame_size
;
72
}
else
{
73
pkt
->size = 0;
74
}
75
}
else
{
76
pkt
->size = 0;
77
}
78
79
return
0;
80
fail
:
81
av_packet_unref
(
pkt
);
82
return
ret;
83
}
84
85
static
const
enum
AVCodecID
codec_ids
[] = {
86
AV_CODEC_ID_EAC3
,
AV_CODEC_ID_NONE
,
87
};
88
89
const
FFBitStreamFilter
ff_eac3_core_bsf
= {
90
.p.name =
"eac3_core"
,
91
.p.codec_ids =
codec_ids
,
92
.init =
eac3_core_init
,
93
.filter =
eac3_core_filter
,
94
};
codec_ids
static enum AVCodecID codec_ids[]
Definition
aac_adtstoasc.c:146
ac3_parser_internal.h
ff_ac3_parse_header
int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr)
Parse AC-3 frame header.
EAC3_FRAME_TYPE_DEPENDENT
@ EAC3_FRAME_TYPE_DEPENDENT
Definition
ac3defs.h:112
EAC3_FRAME_TYPE_INDEPENDENT
@ EAC3_FRAME_TYPE_INDEPENDENT
Definition
ac3defs.h:111
EAC3_FRAME_TYPE_AC3_CONVERT
@ EAC3_FRAME_TYPE_AC3_CONVERT
Definition
ac3defs.h:113
ff_eac3_core_bsf
const FFBitStreamFilter ff_eac3_core_bsf
Definition
eac3_core.c:89
ff_bsf_get_packet_ref
int ff_bsf_get_packet_ref(AVBSFContext *ctx, AVPacket *pkt)
Called by bitstream filters to get packet for filtering.
Definition
bsf.c:254
bsf.h
bsf_internal.h
AV_PROFILE_UNKNOWN
#define AV_PROFILE_UNKNOWN
Definition
defs.h:65
pkt
static AVPacket * pkt
Definition
demux_decode.c:55
eac3_core_init
static int eac3_core_init(AVBSFContext *ctx)
Definition
eac3_core.c:26
eac3_core_filter
static int eac3_core_filter(AVBSFContext *ctx, AVPacket *pkt)
Definition
eac3_core.c:33
get_bits.h
bitstream reader API header.
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition
get_bits.h:544
fail
#define fail
Definition
test.h:479
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition
codec_id.h:47
AV_CODEC_ID_EAC3
@ AV_CODEC_ID_EAC3
Definition
codec_id.h:493
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition
codec_id.h:48
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition
packet.c:434
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition
error.h:61
FFMIN
#define FFMIN(a, b)
Definition
macros.h:49
AC3HeaderInfo
Coded AC-3 header values up to the lfeon element, plus derived values.
Definition
ac3_parser_internal.h:34
AC3HeaderInfo::frame_type
uint8_t frame_type
Definition
ac3_parser_internal.h:45
AC3HeaderInfo::frame_size
uint16_t frame_size
Definition
ac3_parser_internal.h:62
AVBSFContext
The bitstream filter state.
Definition
bsf.h:68
AVPacket
This structure stores compressed data.
Definition
packet.h:580
FFBitStreamFilter
Definition
bsf_internal.h:29
GetBitContext
Definition
get_bits.h:109
ctx
static AVFormatContext * ctx
Definition
movenc.c:49
Generated on Mon Aug 17 2026 20:20:52 for FFmpeg by
1.13.2