Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
1bca72e1
Commit
1bca72e1
authored
May 29, 2011
by
Justin Ruggles
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
eac3enc: support writing of basic mixing and info metadata
parent
e72f3d10
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
210 additions
and
93 deletions
+210
-93
ac3enc.c
libavcodec/ac3enc.c
+159
-80
ac3enc.h
libavcodec/ac3enc.h
+2
-0
ac3enc_opts_template.c
libavcodec/ac3enc_opts_template.c
+6
-8
ac3enc_template.c
libavcodec/ac3enc_template.c
+1
-1
eac3enc.c
libavcodec/eac3enc.c
+42
-4
No files found.
libavcodec/ac3enc.c
View file @
1bca72e1
...
...
@@ -759,6 +759,30 @@ static void count_frame_bits(AC3EncodeContext *s)
/* header */
if
(
s
->
eac3
)
{
if
(
opt
->
eac3_mixing_metadata
)
{
if
(
s
->
channel_mode
>
AC3_CHMODE_STEREO
)
frame_bits
+=
2
;
if
(
s
->
has_center
)
frame_bits
+=
6
;
if
(
s
->
has_surround
)
frame_bits
+=
6
;
frame_bits
+=
s
->
lfe_on
;
frame_bits
+=
1
+
1
+
2
;
if
(
s
->
channel_mode
<
AC3_CHMODE_STEREO
)
frame_bits
++
;
frame_bits
++
;
}
if
(
opt
->
eac3_info_metadata
)
{
frame_bits
+=
3
+
1
+
1
;
if
(
s
->
channel_mode
==
AC3_CHMODE_STEREO
)
frame_bits
+=
2
+
2
;
if
(
s
->
channel_mode
>=
AC3_CHMODE_2F2R
)
frame_bits
+=
2
;
frame_bits
++
;
if
(
opt
->
audio_production_info
)
frame_bits
+=
5
+
2
+
1
;
frame_bits
++
;
}
/* coupling */
if
(
s
->
channel_mode
>
AC3_CHMODE_MONO
)
{
frame_bits
++
;
...
...
@@ -1736,93 +1760,162 @@ int ff_ac3_validate_metadata(AC3EncodeContext *s)
AVCodecContext
*
avctx
=
s
->
avctx
;
AC3EncOptions
*
opt
=
&
s
->
options
;
/* validate mixing levels */
if
(
s
->
has_center
)
{
validate_mix_level
(
avctx
,
"center_mix_level"
,
&
opt
->
center_mix_level
,
cmixlev_options
,
CMIXLEV_NUM_OPTIONS
,
1
,
0
,
&
s
->
center_mix_level
);
opt
->
audio_production_info
=
0
;
opt
->
extended_bsi_1
=
0
;
opt
->
extended_bsi_2
=
0
;
opt
->
eac3_mixing_metadata
=
0
;
opt
->
eac3_info_metadata
=
0
;
/* determine mixing metadata / xbsi1 use */
if
(
s
->
channel_mode
>
AC3_CHMODE_STEREO
&&
opt
->
preferred_stereo_downmix
>=
0
)
{
opt
->
extended_bsi_1
=
1
;
opt
->
eac3_mixing_metadata
=
1
;
}
if
(
s
->
has_center
&&
(
opt
->
ltrt_center_mix_level
>=
0
||
opt
->
loro_center_mix_level
>=
0
))
{
opt
->
extended_bsi_1
=
1
;
opt
->
eac3_mixing_metadata
=
1
;
}
if
(
s
->
has_surround
)
{
validate_mix_level
(
avctx
,
"surround_mix_level"
,
&
opt
->
surround_mix_level
,
surmixlev_options
,
SURMIXLEV_NUM_OPTIONS
,
1
,
0
,
&
s
->
surround_mix_level
)
;
if
(
s
->
has_surround
&&
(
opt
->
ltrt_surround_mix_level
>=
0
||
opt
->
loro_surround_mix_level
>=
0
))
{
opt
->
extended_bsi_1
=
1
;
opt
->
eac3_mixing_metadata
=
1
;
}
/* set audio production info flag */
if
(
opt
->
mixing_level
>=
0
||
opt
->
room_type
>=
0
)
{
if
(
opt
->
mixing_level
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"mixing_level must be set if "
"room_type is set
\n
"
);
return
AVERROR
(
EINVAL
);
}
if
(
opt
->
mixing_level
<
80
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"invalid mixing level. must be between "
"80dB and 111dB
\n
"
);
return
AVERROR
(
EINVAL
);
if
(
s
->
eac3
)
{
/* determine info metadata use */
if
(
avctx
->
audio_service_type
!=
AV_AUDIO_SERVICE_TYPE_MAIN
)
opt
->
eac3_info_metadata
=
1
;
if
(
opt
->
copyright
>=
0
||
opt
->
original
>=
0
)
opt
->
eac3_info_metadata
=
1
;
if
(
s
->
channel_mode
==
AC3_CHMODE_STEREO
&&
(
opt
->
dolby_headphone_mode
>=
0
||
opt
->
dolby_surround_mode
>=
0
))
opt
->
eac3_info_metadata
=
1
;
if
(
s
->
channel_mode
>=
AC3_CHMODE_2F2R
&&
opt
->
dolby_surround_ex_mode
>=
0
)
opt
->
eac3_info_metadata
=
1
;
if
(
opt
->
mixing_level
>=
0
||
opt
->
room_type
>=
0
||
opt
->
ad_converter_type
>=
0
)
{
opt
->
audio_production_info
=
1
;
opt
->
eac3_info_metadata
=
1
;
}
/* default room type */
if
(
opt
->
room_type
<
0
)
opt
->
room_type
=
0
;
opt
->
audio_production_info
=
1
;
}
else
{
opt
->
audio_production_info
=
0
;
/* determine audio production info use */
if
(
opt
->
mixing_level
>=
0
||
opt
->
room_type
>=
0
)
opt
->
audio_production_info
=
1
;
/* determine xbsi2 use */
if
(
s
->
channel_mode
>=
AC3_CHMODE_2F2R
&&
opt
->
dolby_surround_ex_mode
>=
0
)
opt
->
extended_bsi_2
=
1
;
if
(
s
->
channel_mode
==
AC3_CHMODE_STEREO
&&
opt
->
dolby_headphone_mode
>=
0
)
opt
->
extended_bsi_2
=
1
;
if
(
opt
->
ad_converter_type
>=
0
)
opt
->
extended_bsi_2
=
1
;
}
/* set extended bsi 1 flag */
if
((
s
->
has_center
||
s
->
has_surround
)
&&
(
opt
->
preferred_stereo_downmix
>=
0
||
opt
->
ltrt_center_mix_level
>=
0
||
opt
->
ltrt_surround_mix_level
>=
0
||
opt
->
loro_center_mix_level
>=
0
||
opt
->
loro_surround_mix_level
>=
0
))
{
/* validate AC-3 mixing levels */
if
(
!
s
->
eac3
)
{
if
(
s
->
has_center
)
{
validate_mix_level
(
avctx
,
"center_mix_level"
,
&
opt
->
center_mix_level
,
cmixlev_options
,
CMIXLEV_NUM_OPTIONS
,
1
,
0
,
&
s
->
center_mix_level
);
}
if
(
s
->
has_surround
)
{
validate_mix_level
(
avctx
,
"surround_mix_level"
,
&
opt
->
surround_mix_level
,
surmixlev_options
,
SURMIXLEV_NUM_OPTIONS
,
1
,
0
,
&
s
->
surround_mix_level
);
}
}
/* validate extended bsi 1 / mixing metadata */
if
(
opt
->
extended_bsi_1
||
opt
->
eac3_mixing_metadata
)
{
/* default preferred stereo downmix */
if
(
opt
->
preferred_stereo_downmix
<
0
)
opt
->
preferred_stereo_downmix
=
0
;
/* validate Lt/Rt center mix level */
validate_mix_level
(
avctx
,
"ltrt_center_mix_level"
,
&
opt
->
ltrt_center_mix_level
,
extmixlev_options
,
EXTMIXLEV_NUM_OPTIONS
,
5
,
0
,
&
s
->
ltrt_center_mix_level
);
/* validate Lt/Rt surround mix level */
validate_mix_level
(
avctx
,
"ltrt_surround_mix_level"
,
&
opt
->
ltrt_surround_mix_level
,
extmixlev_options
,
EXTMIXLEV_NUM_OPTIONS
,
6
,
3
,
&
s
->
ltrt_surround_mix_level
);
/* validate Lo/Ro center mix level */
validate_mix_level
(
avctx
,
"loro_center_mix_level"
,
&
opt
->
loro_center_mix_level
,
extmixlev_options
,
EXTMIXLEV_NUM_OPTIONS
,
5
,
0
,
&
s
->
loro_center_mix_level
);
/* validate Lo/Ro surround mix level */
validate_mix_level
(
avctx
,
"loro_surround_mix_level"
,
&
opt
->
loro_surround_mix_level
,
extmixlev_options
,
EXTMIXLEV_NUM_OPTIONS
,
6
,
3
,
&
s
->
loro_surround_mix_level
);
opt
->
extended_bsi_1
=
1
;
}
else
{
opt
->
extended_bsi_1
=
0
;
if
(
!
s
->
eac3
||
s
->
has_center
)
{
/* validate Lt/Rt center mix level */
validate_mix_level
(
avctx
,
"ltrt_center_mix_level"
,
&
opt
->
ltrt_center_mix_level
,
extmixlev_options
,
EXTMIXLEV_NUM_OPTIONS
,
5
,
0
,
&
s
->
ltrt_center_mix_level
);
/* validate Lo/Ro center mix level */
validate_mix_level
(
avctx
,
"loro_center_mix_level"
,
&
opt
->
loro_center_mix_level
,
extmixlev_options
,
EXTMIXLEV_NUM_OPTIONS
,
5
,
0
,
&
s
->
loro_center_mix_level
);
}
if
(
!
s
->
eac3
||
s
->
has_surround
)
{
/* validate Lt/Rt surround mix level */
validate_mix_level
(
avctx
,
"ltrt_surround_mix_level"
,
&
opt
->
ltrt_surround_mix_level
,
extmixlev_options
,
EXTMIXLEV_NUM_OPTIONS
,
6
,
3
,
&
s
->
ltrt_surround_mix_level
);
/* validate Lo/Ro surround mix level */
validate_mix_level
(
avctx
,
"loro_surround_mix_level"
,
&
opt
->
loro_surround_mix_level
,
extmixlev_options
,
EXTMIXLEV_NUM_OPTIONS
,
6
,
3
,
&
s
->
loro_surround_mix_level
);
}
}
/* set extended bsi 2 flag */
if
(
opt
->
dolby_surround_ex_mode
>=
0
||
opt
->
dolby_headphone_mode
>=
0
||
opt
->
ad_converter_type
>=
0
)
{
/* default dolby surround ex mode */
if
(
opt
->
dolby_surround_ex_mode
<
0
)
opt
->
dolby_surround_ex_mode
=
0
;
/* validate audio service type / channels combination */
if
((
avctx
->
audio_service_type
==
AV_AUDIO_SERVICE_TYPE_KARAOKE
&&
avctx
->
channels
==
1
)
||
((
avctx
->
audio_service_type
==
AV_AUDIO_SERVICE_TYPE_COMMENTARY
||
avctx
->
audio_service_type
==
AV_AUDIO_SERVICE_TYPE_EMERGENCY
||
avctx
->
audio_service_type
==
AV_AUDIO_SERVICE_TYPE_VOICE_OVER
)
&&
avctx
->
channels
>
1
))
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"invalid audio service type for the "
"specified number of channels
\n
"
);
return
AVERROR
(
EINVAL
);
}
/* validate extended bsi 2 / info metadata */
if
(
opt
->
extended_bsi_2
||
opt
->
eac3_info_metadata
)
{
/* default dolby headphone mode */
if
(
opt
->
dolby_headphone_mode
<
0
)
opt
->
dolby_headphone_mode
=
0
;
/* default dolby surround ex mode */
if
(
opt
->
dolby_surround_ex_mode
<
0
)
opt
->
dolby_surround_ex_mode
=
0
;
/* default A/D converter type */
if
(
opt
->
ad_converter_type
<
0
)
opt
->
ad_converter_type
=
0
;
opt
->
extended_bsi_2
=
1
;
}
else
{
opt
->
extended_bsi_2
=
0
;
}
/* copyright & original defaults */
if
(
!
s
->
eac3
||
opt
->
eac3_info_metadata
)
{
/* default copyright */
if
(
opt
->
copyright
<
0
)
opt
->
copyright
=
0
;
/* default original */
if
(
opt
->
original
<
0
)
opt
->
original
=
1
;
}
/* dolby surround mode default */
if
(
!
s
->
eac3
||
opt
->
eac3_info_metadata
)
{
if
(
opt
->
dolby_surround_mode
<
0
)
opt
->
dolby_surround_mode
=
0
;
}
/* validate audio production info */
if
(
opt
->
audio_production_info
)
{
if
(
opt
->
mixing_level
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"mixing_level must be set if "
"room_type is set
\n
"
);
return
AVERROR
(
EINVAL
);
}
if
(
opt
->
mixing_level
<
80
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"invalid mixing level. must be between "
"80dB and 111dB
\n
"
);
return
AVERROR
(
EINVAL
);
}
/* default room type */
if
(
opt
->
room_type
<
0
)
opt
->
room_type
=
0
;
}
/* set bitstream id for alternate bitstream syntax */
if
(
opt
->
extended_bsi_1
||
opt
->
extended_bsi_2
)
{
if
(
!
s
->
eac3
&&
(
opt
->
extended_bsi_1
||
opt
->
extended_bsi_2
)
)
{
if
(
s
->
bitstream_id
>
8
&&
s
->
bitstream_id
<
11
)
{
static
int
warn_once
=
1
;
if
(
warn_once
)
{
...
...
@@ -2041,23 +2134,9 @@ static av_cold int validate_options(AC3EncodeContext *s)
if
(
s
->
cutoff
>
(
s
->
sample_rate
>>
1
))
s
->
cutoff
=
s
->
sample_rate
>>
1
;
/* validate audio service type / channels combination */
if
((
avctx
->
audio_service_type
==
AV_AUDIO_SERVICE_TYPE_KARAOKE
&&
avctx
->
channels
==
1
)
||
((
avctx
->
audio_service_type
==
AV_AUDIO_SERVICE_TYPE_COMMENTARY
||
avctx
->
audio_service_type
==
AV_AUDIO_SERVICE_TYPE_EMERGENCY
||
avctx
->
audio_service_type
==
AV_AUDIO_SERVICE_TYPE_VOICE_OVER
)
&&
avctx
->
channels
>
1
))
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"invalid audio service type for the "
"specified number of channels
\n
"
);
return
AVERROR
(
EINVAL
);
}
if
(
!
s
->
eac3
)
{
ret
=
ff_ac3_validate_metadata
(
s
);
if
(
ret
)
return
ret
;
}
s
->
rematrixing_enabled
=
s
->
options
.
stereo_rematrixing
&&
(
s
->
channel_mode
==
AC3_CHMODE_STEREO
);
...
...
libavcodec/ac3enc.h
View file @
1bca72e1
...
...
@@ -91,6 +91,8 @@ typedef struct AC3EncOptions {
int
dolby_surround_ex_mode
;
int
dolby_headphone_mode
;
int
ad_converter_type
;
int
eac3_mixing_metadata
;
int
eac3_info_metadata
;
/* other encoding options */
int
allow_per_frame_metadata
;
...
...
libavcodec/ac3enc_opts_template.c
View file @
1bca72e1
...
...
@@ -29,12 +29,13 @@ static const AVOption ac3_options[] = {
#else
/* AC3ENC_TYPE_EAC3 */
static
const
AVOption
eac3_options
[]
=
{
#endif
#if AC3ENC_TYPE != AC3ENC_TYPE_EAC3
/* Metadata Options */
{
"per_frame_metadata"
,
"Allow Changing Metadata Per-Frame"
,
OFFSET
(
allow_per_frame_metadata
),
FF_OPT_TYPE_INT
,
{.
dbl
=
0
},
0
,
1
,
AC3ENC_PARAM
},
/* downmix levels */
#if AC3ENC_TYPE != AC3ENC_TYPE_EAC3
/* AC-3 downmix levels */
{
"center_mixlev"
,
"Center Mix Level"
,
OFFSET
(
center_mix_level
),
FF_OPT_TYPE_FLOAT
,
{.
dbl
=
LEVEL_MINUS_4POINT5DB
},
0
.
0
,
1
.
0
,
AC3ENC_PARAM
},
{
"surround_mixlev"
,
"Surround Mix Level"
,
OFFSET
(
surround_mix_level
),
FF_OPT_TYPE_FLOAT
,
{.
dbl
=
LEVEL_MINUS_6DB
},
0
.
0
,
1
.
0
,
AC3ENC_PARAM
},
#endif
/* audio production information */
{
"mixing_level"
,
"Mixing Level"
,
OFFSET
(
mixing_level
),
FF_OPT_TYPE_INT
,
{.
dbl
=
-
1
},
-
1
,
111
,
AC3ENC_PARAM
},
{
"room_type"
,
"Room Type"
,
OFFSET
(
room_type
),
FF_OPT_TYPE_INT
,
{.
dbl
=
-
1
},
-
1
,
2
,
AC3ENC_PARAM
,
"room_type"
},
...
...
@@ -42,15 +43,13 @@ static const AVOption eac3_options[] = {
{
"large"
,
"Large Room"
,
0
,
FF_OPT_TYPE_CONST
,
{.
dbl
=
1
},
INT_MIN
,
INT_MAX
,
AC3ENC_PARAM
,
"room_type"
},
{
"small"
,
"Small Room"
,
0
,
FF_OPT_TYPE_CONST
,
{.
dbl
=
2
},
INT_MIN
,
INT_MAX
,
AC3ENC_PARAM
,
"room_type"
},
/* other metadata options */
{
"copyright"
,
"Copyright Bit"
,
OFFSET
(
copyright
),
FF_OPT_TYPE_INT
,
{.
dbl
=
0
},
0
,
1
,
AC3ENC_PARAM
},
#endif
{
"copyright"
,
"Copyright Bit"
,
OFFSET
(
copyright
),
FF_OPT_TYPE_INT
,
{.
dbl
=
-
1
},
-
1
,
1
,
AC3ENC_PARAM
},
{
"dialnorm"
,
"Dialogue Level (dB)"
,
OFFSET
(
dialogue_level
),
FF_OPT_TYPE_INT
,
{.
dbl
=
-
31
},
-
31
,
-
1
,
AC3ENC_PARAM
},
#if AC3ENC_TYPE != AC3ENC_TYPE_EAC3
{
"dsur_mode"
,
"Dolby Surround Mode"
,
OFFSET
(
dolby_surround_mode
),
FF_OPT_TYPE_INT
,
{.
dbl
=
0
},
0
,
2
,
AC3ENC_PARAM
,
"dsur_mode"
},
{
"dsur_mode"
,
"Dolby Surround Mode"
,
OFFSET
(
dolby_surround_mode
),
FF_OPT_TYPE_INT
,
{.
dbl
=
-
1
},
-
1
,
2
,
AC3ENC_PARAM
,
"dsur_mode"
},
{
"notindicated"
,
"Not Indicated (default)"
,
0
,
FF_OPT_TYPE_CONST
,
{.
dbl
=
0
},
INT_MIN
,
INT_MAX
,
AC3ENC_PARAM
,
"dsur_mode"
},
{
"on"
,
"Dolby Surround Encoded"
,
0
,
FF_OPT_TYPE_CONST
,
{.
dbl
=
1
},
INT_MIN
,
INT_MAX
,
AC3ENC_PARAM
,
"dsur_mode"
},
{
"off"
,
"Not Dolby Surround Encoded"
,
0
,
FF_OPT_TYPE_CONST
,
{.
dbl
=
2
},
INT_MIN
,
INT_MAX
,
AC3ENC_PARAM
,
"dsur_mode"
},
{
"original"
,
"Original Bit Stream"
,
OFFSET
(
original
),
FF_OPT_TYPE_INT
,
{.
dbl
=
1
},
0
,
1
,
AC3ENC_PARAM
},
{
"original"
,
"Original Bit Stream"
,
OFFSET
(
original
),
FF_OPT_TYPE_INT
,
{.
dbl
=
-
1
},
-
1
,
1
,
AC3ENC_PARAM
},
/* extended bitstream information */
{
"dmix_mode"
,
"Preferred Stereo Downmix Mode"
,
OFFSET
(
preferred_stereo_downmix
),
FF_OPT_TYPE_INT
,
{.
dbl
=
-
1
},
-
1
,
2
,
AC3ENC_PARAM
,
"dmix_mode"
},
{
"notindicated"
,
"Not Indicated (default)"
,
0
,
FF_OPT_TYPE_CONST
,
{.
dbl
=
0
},
INT_MIN
,
INT_MAX
,
AC3ENC_PARAM
,
"dmix_mode"
},
...
...
@@ -71,7 +70,6 @@ static const AVOption eac3_options[] = {
{
"ad_conv_type"
,
"A/D Converter Type"
,
OFFSET
(
ad_converter_type
),
FF_OPT_TYPE_INT
,
{.
dbl
=
-
1
},
-
1
,
1
,
AC3ENC_PARAM
,
"ad_conv_type"
},
{
"standard"
,
"Standard (default)"
,
0
,
FF_OPT_TYPE_CONST
,
{.
dbl
=
0
},
INT_MIN
,
INT_MAX
,
AC3ENC_PARAM
,
"ad_conv_type"
},
{
"hdcd"
,
"HDCD"
,
0
,
FF_OPT_TYPE_CONST
,
{.
dbl
=
1
},
INT_MIN
,
INT_MAX
,
AC3ENC_PARAM
,
"ad_conv_type"
},
#endif
/* Other Encoding Options */
{
"stereo_rematrixing"
,
"Stereo Rematrixing"
,
OFFSET
(
stereo_rematrixing
),
FF_OPT_TYPE_INT
,
{.
dbl
=
1
},
0
,
1
,
AC3ENC_PARAM
},
#if AC3ENC_TYPE != AC3ENC_TYPE_AC3_FIXED
...
...
libavcodec/ac3enc_template.c
View file @
1bca72e1
...
...
@@ -423,7 +423,7 @@ int AC3_NAME(encode_frame)(AVCodecContext *avctx, unsigned char *frame,
const
SampleType
*
samples
=
data
;
int
ret
;
if
(
!
s
->
eac3
&&
s
->
options
.
allow_per_frame_metadata
)
{
if
(
s
->
options
.
allow_per_frame_metadata
)
{
ret
=
ff_ac3_validate_metadata
(
s
);
if
(
ret
)
return
ret
;
...
...
libavcodec/eac3enc.c
View file @
1bca72e1
...
...
@@ -142,10 +142,48 @@ void ff_eac3_output_frame_header(AC3EncodeContext *s)
put_bits
(
&
s
->
pb
,
5
,
s
->
bitstream_id
);
/* bitstream id (EAC3=16) */
put_bits
(
&
s
->
pb
,
5
,
-
opt
->
dialogue_level
);
/* dialogue normalization level */
put_bits
(
&
s
->
pb
,
1
,
0
);
/* no compression gain */
put_bits
(
&
s
->
pb
,
1
,
0
);
/* no mixing metadata */
/* TODO: mixing metadata */
put_bits
(
&
s
->
pb
,
1
,
0
);
/* no info metadata */
/* TODO: info metadata */
/* mixing metadata*/
put_bits
(
&
s
->
pb
,
1
,
opt
->
eac3_mixing_metadata
);
if
(
opt
->
eac3_mixing_metadata
)
{
if
(
s
->
channel_mode
>
AC3_CHMODE_STEREO
)
put_bits
(
&
s
->
pb
,
2
,
opt
->
preferred_stereo_downmix
);
if
(
s
->
has_center
)
{
put_bits
(
&
s
->
pb
,
3
,
s
->
ltrt_center_mix_level
);
put_bits
(
&
s
->
pb
,
3
,
s
->
loro_center_mix_level
);
}
if
(
s
->
has_surround
)
{
put_bits
(
&
s
->
pb
,
3
,
s
->
ltrt_surround_mix_level
);
put_bits
(
&
s
->
pb
,
3
,
s
->
loro_surround_mix_level
);
}
if
(
s
->
lfe_on
)
put_bits
(
&
s
->
pb
,
1
,
0
);
put_bits
(
&
s
->
pb
,
1
,
0
);
/* no program scale */
put_bits
(
&
s
->
pb
,
1
,
0
);
/* no ext program scale */
put_bits
(
&
s
->
pb
,
2
,
0
);
/* no mixing parameters */
if
(
s
->
channel_mode
<
AC3_CHMODE_STEREO
)
put_bits
(
&
s
->
pb
,
1
,
0
);
/* no pan info */
put_bits
(
&
s
->
pb
,
1
,
0
);
/* no frame mix config info */
}
/* info metadata*/
put_bits
(
&
s
->
pb
,
1
,
opt
->
eac3_info_metadata
);
if
(
opt
->
eac3_info_metadata
)
{
put_bits
(
&
s
->
pb
,
3
,
s
->
bitstream_mode
);
put_bits
(
&
s
->
pb
,
1
,
opt
->
copyright
);
put_bits
(
&
s
->
pb
,
1
,
opt
->
original
);
if
(
s
->
channel_mode
==
AC3_CHMODE_STEREO
)
{
put_bits
(
&
s
->
pb
,
2
,
opt
->
dolby_surround_mode
);
put_bits
(
&
s
->
pb
,
2
,
opt
->
dolby_headphone_mode
);
}
if
(
s
->
channel_mode
>=
AC3_CHMODE_2F2R
)
put_bits
(
&
s
->
pb
,
2
,
opt
->
dolby_surround_ex_mode
);
put_bits
(
&
s
->
pb
,
1
,
opt
->
audio_production_info
);
if
(
opt
->
audio_production_info
)
{
put_bits
(
&
s
->
pb
,
5
,
opt
->
mixing_level
-
80
);
put_bits
(
&
s
->
pb
,
2
,
opt
->
room_type
);
put_bits
(
&
s
->
pb
,
1
,
opt
->
ad_converter_type
);
}
put_bits
(
&
s
->
pb
,
1
,
0
);
}
if
(
s
->
num_blocks
!=
6
)
put_bits
(
&
s
->
pb
,
1
,
!
(
s
->
avctx
->
frame_number
%
6
));
/* converter sync flag */
put_bits
(
&
s
->
pb
,
1
,
0
);
/* no additional bit stream info */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment