Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| efa89a8419 |
@@ -554,7 +554,6 @@ Jean Delvare 7CA6 9F44 60F1 BDC4 1FD2 C858 A552 6B9B B3CD 4E6A
|
|||||||
Loren Merritt ABD9 08F4 C920 3F65 D8BE 35D7 1540 DAA7 060F 56DE
|
Loren Merritt ABD9 08F4 C920 3F65 D8BE 35D7 1540 DAA7 060F 56DE
|
||||||
Lou Logan 7D68 DC73 CBEF EABB 671A B6CF 621C 2E28 82F8 DC3A
|
Lou Logan 7D68 DC73 CBEF EABB 671A B6CF 621C 2E28 82F8 DC3A
|
||||||
Michael Niedermayer 9FF2 128B 147E F673 0BAD F133 611E C787 040B 0FAB
|
Michael Niedermayer 9FF2 128B 147E F673 0BAD F133 611E C787 040B 0FAB
|
||||||
DD1E C9E8 DE08 5C62 9B3E 1846 B18E 8928 B394 8D64
|
|
||||||
Nicolas George 24CE 01CE 9ACC 5CEB 74D8 8D9D B063 D997 36E5 4C93
|
Nicolas George 24CE 01CE 9ACC 5CEB 74D8 8D9D B063 D997 36E5 4C93
|
||||||
Nikolay Aleksandrov 8978 1D8C FB71 588E 4B27 EAA8 C4F0 B5FC E011 13B1
|
Nikolay Aleksandrov 8978 1D8C FB71 588E 4B27 EAA8 C4F0 B5FC E011 13B1
|
||||||
Panagiotis Issaris 6571 13A3 33D9 3726 F728 AA98 F643 B12E ECF3 E029
|
Panagiotis Issaris 6571 13A3 33D9 3726 F728 AA98 F643 B12E ECF3 E029
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
|
|
||||||
┌────────────────────────────────────────┐
|
|
||||||
│ RELEASE NOTES for FFmpeg 3.2 "Hypatia" │
|
|
||||||
└────────────────────────────────────────┘
|
|
||||||
|
|
||||||
The FFmpeg Project proudly presents FFmpeg 3.2 "Hypatia", about 4
|
|
||||||
months after the release of FFmpeg 3.1.
|
|
||||||
|
|
||||||
A complete Changelog is available at the root of the project, and the
|
|
||||||
complete Git history on http://source.ffmpeg.org.
|
|
||||||
|
|
||||||
We hope you will like this release as much as we enjoyed working on it, and
|
|
||||||
as usual, if you have any questions about it, or any FFmpeg related topic,
|
|
||||||
feel free to join us on the #ffmpeg IRC channel (on irc.libera.chat) or ask
|
|
||||||
on the mailing-lists.
|
|
||||||
@@ -483,7 +483,7 @@ die(){
|
|||||||
|
|
||||||
If you think configure made a mistake, make sure you are using the latest
|
If you think configure made a mistake, make sure you are using the latest
|
||||||
version from Git. If the latest version fails, report the problem to the
|
version from Git. If the latest version fails, report the problem to the
|
||||||
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.libera.chat.
|
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
|
||||||
EOF
|
EOF
|
||||||
if disabled logging; then
|
if disabled logging; then
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
@@ -1146,16 +1146,10 @@ check_func_headers(){
|
|||||||
for hdr in $headers; do
|
for hdr in $headers; do
|
||||||
print_include $hdr
|
print_include $hdr
|
||||||
done
|
done
|
||||||
echo "#include <stdint.h>"
|
|
||||||
for func in $funcs; do
|
for func in $funcs; do
|
||||||
echo "long check_$func(void) { return (long) $func; }"
|
echo "long check_$func(void) { return (long) $func; }"
|
||||||
done
|
done
|
||||||
echo "int main(void) { int ret = 0;"
|
echo "int main(void) { return 0; }"
|
||||||
# LTO could optimize out the test functions without this
|
|
||||||
for func in $funcs; do
|
|
||||||
echo " ret |= ((intptr_t)check_$func) & 0xFFFF;"
|
|
||||||
done
|
|
||||||
echo "return ret; }"
|
|
||||||
} | check_ld "cc" "$@" && enable $funcs && enable_safe $headers
|
} | check_ld "cc" "$@" && enable $funcs && enable_safe $headers
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1651,6 +1645,7 @@ CONFIG_LIST="
|
|||||||
$PROGRAM_LIST
|
$PROGRAM_LIST
|
||||||
$SUBSYSTEM_LIST
|
$SUBSYSTEM_LIST
|
||||||
fontconfig
|
fontconfig
|
||||||
|
incompatible_libav_abi
|
||||||
memalign_hack
|
memalign_hack
|
||||||
memory_poisoning
|
memory_poisoning
|
||||||
neon_clobber_test
|
neon_clobber_test
|
||||||
@@ -1803,6 +1798,7 @@ HAVE_LIST_CMDLINE="
|
|||||||
HAVE_LIST_PUB="
|
HAVE_LIST_PUB="
|
||||||
bigendian
|
bigendian
|
||||||
fast_unaligned
|
fast_unaligned
|
||||||
|
incompatible_libav_abi
|
||||||
"
|
"
|
||||||
|
|
||||||
HEADERS_LIST="
|
HEADERS_LIST="
|
||||||
@@ -6271,7 +6267,6 @@ __declspec($_restrict) void* foo(int);
|
|||||||
EOF
|
EOF
|
||||||
fi
|
fi
|
||||||
check_func strtoll || add_cflags -Dstrtoll=_strtoi64
|
check_func strtoll || add_cflags -Dstrtoll=_strtoi64
|
||||||
check_func strtoull || add_cflags -Dstrtoull=_strtoui64
|
|
||||||
# the new SSA optimzer in VS2015 U3 is mis-optimizing some parts of the code
|
# the new SSA optimzer in VS2015 U3 is mis-optimizing some parts of the code
|
||||||
# this flag should be re-checked on newer compiler releases and put under a
|
# this flag should be re-checked on newer compiler releases and put under a
|
||||||
# version check once its fixed
|
# version check once its fixed
|
||||||
@@ -6703,7 +6698,7 @@ cat > $TMPH <<EOF
|
|||||||
#define FFMPEG_CONFIG_H
|
#define FFMPEG_CONFIG_H
|
||||||
#define FFMPEG_CONFIGURATION "$(c_escape $FFMPEG_CONFIGURATION)"
|
#define FFMPEG_CONFIGURATION "$(c_escape $FFMPEG_CONFIGURATION)"
|
||||||
#define FFMPEG_LICENSE "$(c_escape $license)"
|
#define FFMPEG_LICENSE "$(c_escape $license)"
|
||||||
#define CONFIG_THIS_YEAR 2022
|
#define CONFIG_THIS_YEAR 2016
|
||||||
#define FFMPEG_DATADIR "$(eval c_escape $datadir)"
|
#define FFMPEG_DATADIR "$(eval c_escape $datadir)"
|
||||||
#define AVCONV_DATADIR "$(eval c_escape $datadir)"
|
#define AVCONV_DATADIR "$(eval c_escape $datadir)"
|
||||||
#define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
|
#define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
|
||||||
|
|||||||
+2
-2
@@ -515,7 +515,7 @@ API changes, most recent first:
|
|||||||
Add av_opt_get_dict_val/set_dict_val with AV_OPT_TYPE_DICT to support
|
Add av_opt_get_dict_val/set_dict_val with AV_OPT_TYPE_DICT to support
|
||||||
dictionary types being set as options.
|
dictionary types being set as options.
|
||||||
|
|
||||||
2014-08-13 - afbd4b7e09 - lavf 56.01.0 - avformat.h
|
2014-08-13 - afbd4b8 - lavf 56.01.0 - avformat.h
|
||||||
Add AVFormatContext.event_flags and AVStream.event_flags for signaling to
|
Add AVFormatContext.event_flags and AVStream.event_flags for signaling to
|
||||||
the user when events happen in the file/stream.
|
the user when events happen in the file/stream.
|
||||||
|
|
||||||
@@ -532,7 +532,7 @@ API changes, most recent first:
|
|||||||
2014-08-08 - 5c3c671 - lavf 55.53.100 - avio.h
|
2014-08-08 - 5c3c671 - lavf 55.53.100 - avio.h
|
||||||
Add avio_feof() and deprecate url_feof().
|
Add avio_feof() and deprecate url_feof().
|
||||||
|
|
||||||
2014-08-07 - bb789016d4 - lsws 2.1.3 - swscale.h
|
2014-08-07 - bb78903 - lsws 2.1.3 - swscale.h
|
||||||
sws_getContext is not going to be removed in the future.
|
sws_getContext is not going to be removed in the future.
|
||||||
|
|
||||||
2014-08-07 - a561662 / ad1ee5f - lavc 55.73.101 / 55.57.3 - avcodec.h
|
2014-08-07 - a561662 / ad1ee5f - lavc 55.73.101 / 55.57.3 - avcodec.h
|
||||||
|
|||||||
+1
-1
@@ -38,7 +38,7 @@ PROJECT_NAME = FFmpeg
|
|||||||
# could be handy for archiving the generated documentation or if some version
|
# could be handy for archiving the generated documentation or if some version
|
||||||
# control system is used.
|
# control system is used.
|
||||||
|
|
||||||
PROJECT_NUMBER = 3.2.19
|
PROJECT_NUMBER =
|
||||||
|
|
||||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||||
# for a project that appears at the top of each page and should give viewer a
|
# for a project that appears at the top of each page and should give viewer a
|
||||||
|
|||||||
@@ -293,24 +293,6 @@ used to end the output video at the length of the shortest input file,
|
|||||||
which in this case is @file{input.mp4} as the GIF in this example loops
|
which in this case is @file{input.mp4} as the GIF in this example loops
|
||||||
infinitely.
|
infinitely.
|
||||||
|
|
||||||
@section hls
|
|
||||||
|
|
||||||
HLS demuxer
|
|
||||||
|
|
||||||
It accepts the following options:
|
|
||||||
|
|
||||||
@table @option
|
|
||||||
@item live_start_index
|
|
||||||
segment index to start live streams at (negative values are from the end).
|
|
||||||
|
|
||||||
@item allowed_extensions
|
|
||||||
',' separated list of file extensions that hls is allowed to access.
|
|
||||||
|
|
||||||
@item max_reload
|
|
||||||
Maximum number of times a insufficient list is attempted to be reloaded.
|
|
||||||
Default value is 1000.
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@section image2
|
@section image2
|
||||||
|
|
||||||
Image file demuxer.
|
Image file demuxer.
|
||||||
|
|||||||
@@ -131,11 +131,6 @@ designated struct initializers (@samp{struct s x = @{ .i = 17 @};});
|
|||||||
|
|
||||||
@item
|
@item
|
||||||
compound literals (@samp{x = (struct s) @{ 17, 23 @};}).
|
compound literals (@samp{x = (struct s) @{ 17, 23 @};}).
|
||||||
|
|
||||||
@item
|
|
||||||
Implementation defined behavior for signed integers is assumed to match the
|
|
||||||
expected behavior for two's complement. Non representable values in integer
|
|
||||||
casts are binary truncated. Shift right of signed values uses sign extension.
|
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
These features are supported by all compilers we care about, so we will not
|
These features are supported by all compilers we care about, so we will not
|
||||||
|
|||||||
+9
-9
@@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
@chapter Synopsis
|
@chapter Synopsis
|
||||||
|
|
||||||
ffmpeg [@var{global_options}] @{[@var{input_file_options}] -i @file{input_url}@} ... @{[@var{output_file_options}] @file{output_url}@} ...
|
ffmpeg [@var{global_options}] @{[@var{input_file_options}] -i @file{input_file}@} ... @{[@var{output_file_options}] @file{output_file}@} ...
|
||||||
|
|
||||||
@chapter Description
|
@chapter Description
|
||||||
@c man begin DESCRIPTION
|
@c man begin DESCRIPTION
|
||||||
@@ -24,10 +24,10 @@ rates and resize video on the fly with a high quality polyphase filter.
|
|||||||
@command{ffmpeg} reads from an arbitrary number of input "files" (which can be regular
|
@command{ffmpeg} reads from an arbitrary number of input "files" (which can be regular
|
||||||
files, pipes, network streams, grabbing devices, etc.), specified by the
|
files, pipes, network streams, grabbing devices, etc.), specified by the
|
||||||
@code{-i} option, and writes to an arbitrary number of output "files", which are
|
@code{-i} option, and writes to an arbitrary number of output "files", which are
|
||||||
specified by a plain output url. Anything found on the command line which
|
specified by a plain output filename. Anything found on the command line which
|
||||||
cannot be interpreted as an option is considered to be an output url.
|
cannot be interpreted as an option is considered to be an output filename.
|
||||||
|
|
||||||
Each input or output url can, in principle, contain any number of streams of
|
Each input or output file can, in principle, contain any number of streams of
|
||||||
different types (video/audio/subtitle/attachment/data). The allowed number and/or
|
different types (video/audio/subtitle/attachment/data). The allowed number and/or
|
||||||
types of streams may be limited by the container format. Selecting which
|
types of streams may be limited by the container format. Selecting which
|
||||||
streams from which inputs will go into which output is either done automatically
|
streams from which inputs will go into which output is either done automatically
|
||||||
@@ -243,8 +243,8 @@ Force input or output file format. The format is normally auto detected for inpu
|
|||||||
files and guessed from the file extension for output files, so this option is not
|
files and guessed from the file extension for output files, so this option is not
|
||||||
needed in most cases.
|
needed in most cases.
|
||||||
|
|
||||||
@item -i @var{url} (@emph{input})
|
@item -i @var{filename} (@emph{input})
|
||||||
input file url
|
input file name
|
||||||
|
|
||||||
@item -y (@emph{global})
|
@item -y (@emph{global})
|
||||||
Overwrite output files without asking.
|
Overwrite output files without asking.
|
||||||
@@ -281,7 +281,7 @@ libx264, and the 138th audio, which will be encoded with libvorbis.
|
|||||||
When used as an input option (before @code{-i}), limit the @var{duration} of
|
When used as an input option (before @code{-i}), limit the @var{duration} of
|
||||||
data read from the input file.
|
data read from the input file.
|
||||||
|
|
||||||
When used as an output option (before an output url), stop writing the
|
When used as an output option (before an output filename), stop writing the
|
||||||
output after its duration reaches @var{duration}.
|
output after its duration reaches @var{duration}.
|
||||||
|
|
||||||
@var{duration} must be a time duration specification,
|
@var{duration} must be a time duration specification,
|
||||||
@@ -310,7 +310,7 @@ extra segment between the seek point and @var{position} will be decoded and
|
|||||||
discarded. When doing stream copy or when @option{-noaccurate_seek} is used, it
|
discarded. When doing stream copy or when @option{-noaccurate_seek} is used, it
|
||||||
will be preserved.
|
will be preserved.
|
||||||
|
|
||||||
When used as an output option (before an output url), decodes but discards
|
When used as an output option (before an output filename), decodes but discards
|
||||||
input until the timestamps reach @var{position}.
|
input until the timestamps reach @var{position}.
|
||||||
|
|
||||||
@var{position} must be a time duration specification,
|
@var{position} must be a time duration specification,
|
||||||
@@ -1129,7 +1129,7 @@ may be reassigned to a different value.
|
|||||||
For example, to set the stream 0 PID to 33 and the stream 1 PID to 36 for
|
For example, to set the stream 0 PID to 33 and the stream 1 PID to 36 for
|
||||||
an output mpegts file:
|
an output mpegts file:
|
||||||
@example
|
@example
|
||||||
ffmpeg -i inurl -streamid 0:33 -streamid 1:36 out.ts
|
ffmpeg -i infile -streamid 0:33 -streamid 1:36 out.ts
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@item -bsf[:@var{stream_specifier}] @var{bitstream_filters} (@emph{output,per-stream})
|
@item -bsf[:@var{stream_specifier}] @var{bitstream_filters} (@emph{output,per-stream})
|
||||||
|
|||||||
+3
-3
@@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
@chapter Synopsis
|
@chapter Synopsis
|
||||||
|
|
||||||
ffplay [@var{options}] [@file{input_url}]
|
ffplay [@var{options}] [@file{input_file}]
|
||||||
|
|
||||||
@chapter Description
|
@chapter Description
|
||||||
@c man begin DESCRIPTION
|
@c man begin DESCRIPTION
|
||||||
@@ -106,8 +106,8 @@ the input audio.
|
|||||||
Use the option "-filters" to show all the available filters (including
|
Use the option "-filters" to show all the available filters (including
|
||||||
sources and sinks).
|
sources and sinks).
|
||||||
|
|
||||||
@item -i @var{input_url}
|
@item -i @var{input_file}
|
||||||
Read @var{input_url}.
|
Read @var{input_file}.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@section Advanced options
|
@section Advanced options
|
||||||
|
|||||||
+5
-5
@@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
@chapter Synopsis
|
@chapter Synopsis
|
||||||
|
|
||||||
ffprobe [@var{options}] [@file{input_url}]
|
ffprobe [@var{options}] [@file{input_file}]
|
||||||
|
|
||||||
@chapter Description
|
@chapter Description
|
||||||
@c man begin DESCRIPTION
|
@c man begin DESCRIPTION
|
||||||
@@ -24,8 +24,8 @@ For example it can be used to check the format of the container used
|
|||||||
by a multimedia stream and the format and type of each media stream
|
by a multimedia stream and the format and type of each media stream
|
||||||
contained in it.
|
contained in it.
|
||||||
|
|
||||||
If a url is specified in input, ffprobe will try to open and
|
If a filename is specified in input, ffprobe will try to open and
|
||||||
probe the url content. If the url cannot be opened or recognized as
|
probe the file content. If the file cannot be opened or recognized as
|
||||||
a multimedia file, a positive exit code is returned.
|
a multimedia file, a positive exit code is returned.
|
||||||
|
|
||||||
ffprobe may be employed both as a standalone application or in
|
ffprobe may be employed both as a standalone application or in
|
||||||
@@ -332,8 +332,8 @@ with name "PIXEL_FORMAT".
|
|||||||
Force bitexact output, useful to produce output which is not dependent
|
Force bitexact output, useful to produce output which is not dependent
|
||||||
on the specific build.
|
on the specific build.
|
||||||
|
|
||||||
@item -i @var{input_url}
|
@item -i @var{input_file}
|
||||||
Read @var{input_url}.
|
Read @var{input_file}.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
@c man end
|
@c man end
|
||||||
|
|||||||
+3
-3
@@ -8217,7 +8217,7 @@ It accepts the following parameters:
|
|||||||
@item filter_name
|
@item filter_name
|
||||||
The name of the frei0r effect to load. If the environment variable
|
The name of the frei0r effect to load. If the environment variable
|
||||||
@env{FREI0R_PATH} is defined, the frei0r effect is searched for in each of the
|
@env{FREI0R_PATH} is defined, the frei0r effect is searched for in each of the
|
||||||
directories specified by the colon-separated list in @env{FREI0R_PATH}.
|
directories specified by the colon-separated list in @env{FREIOR_PATH}.
|
||||||
Otherwise, the standard frei0r paths are searched, in this order:
|
Otherwise, the standard frei0r paths are searched, in this order:
|
||||||
@file{HOME/.frei0r-1/lib/}, @file{/usr/local/lib/frei0r-1/},
|
@file{HOME/.frei0r-1/lib/}, @file{/usr/local/lib/frei0r-1/},
|
||||||
@file{/usr/lib/frei0r-1/}.
|
@file{/usr/lib/frei0r-1/}.
|
||||||
@@ -9665,7 +9665,7 @@ Scene change detection method. Scene change leads motion vectors to be in random
|
|||||||
@item none
|
@item none
|
||||||
Disable scene change detection.
|
Disable scene change detection.
|
||||||
@item fdiff
|
@item fdiff
|
||||||
Frame difference. Corresponding pixel values are compared and if it satisfies @var{scd_threshold} scene change is detected.
|
Frame difference. Corresponding pixel values are compared and if it statisfies @var{scd_threshold} scene change is detected.
|
||||||
@end table
|
@end table
|
||||||
Default method is @samp{fdiff}.
|
Default method is @samp{fdiff}.
|
||||||
|
|
||||||
@@ -11915,7 +11915,7 @@ uses the reference video instead of the main input as basis.
|
|||||||
|
|
||||||
@itemize
|
@itemize
|
||||||
@item
|
@item
|
||||||
Scale a subtitle stream (b) to match the main video (a) in size before overlaying
|
Scale a subtitle stream to match the main video in size before overlaying
|
||||||
@example
|
@example
|
||||||
'scale2ref[b][a];[a][b]overlay'
|
'scale2ref[b][a];[a][b]overlay'
|
||||||
@end example
|
@end example
|
||||||
|
|||||||
+1
-5
@@ -63,7 +63,7 @@ This ensures that file and data checksums are reproducible and match between
|
|||||||
platforms. Its primary use is for regression testing.
|
platforms. Its primary use is for regression testing.
|
||||||
@item shortest
|
@item shortest
|
||||||
Stop muxing at the end of the shortest stream.
|
Stop muxing at the end of the shortest stream.
|
||||||
It may be needed to increase max_interleave_delta to avoid flushing the longer
|
It may be needed to increase max_interleave_delta to avoid flusing the longer
|
||||||
streams before EOF.
|
streams before EOF.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@@ -209,10 +209,6 @@ For example to separate the fields with newlines and indention:
|
|||||||
ffprobe -dump_separator "
|
ffprobe -dump_separator "
|
||||||
" -i ~/videos/matrixbench_mpeg2.mpg
|
" -i ~/videos/matrixbench_mpeg2.mpg
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@item max_streams @var{integer} (@emph{input})
|
|
||||||
Specifies the maximum number of streams. This can be used to reject files that
|
|
||||||
would require too many resources due to a large number of streams.
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@c man end FORMAT OPTIONS
|
@c man end FORMAT OPTIONS
|
||||||
|
|||||||
+1
-21
@@ -187,18 +187,11 @@ to make sure you don't have untracked files or deletions.
|
|||||||
git add [-i|-p|-A] <filenames/dirnames>
|
git add [-i|-p|-A] <filenames/dirnames>
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Make sure you have told Git your name, email address and GPG key
|
Make sure you have told Git your name and email address
|
||||||
|
|
||||||
@example
|
@example
|
||||||
git config --global user.name "My Name"
|
git config --global user.name "My Name"
|
||||||
git config --global user.email my@@email.invalid
|
git config --global user.email my@@email.invalid
|
||||||
git config --global user.signingkey ABCDEF0123245
|
|
||||||
@end example
|
|
||||||
|
|
||||||
Enable signing all commits or use -S
|
|
||||||
|
|
||||||
@example
|
|
||||||
git config --global commit.gpgsign true
|
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Use @option{--global} to set the global configuration for all your Git checkouts.
|
Use @option{--global} to set the global configuration for all your Git checkouts.
|
||||||
@@ -400,19 +393,6 @@ git checkout -b svn_23456 $SHA1
|
|||||||
where @var{$SHA1} is the commit hash from the @command{git log} output.
|
where @var{$SHA1} is the commit hash from the @command{git log} output.
|
||||||
|
|
||||||
|
|
||||||
@chapter gpg key generation
|
|
||||||
|
|
||||||
If you have no gpg key yet, we recommend that you create a ed25519 based key as it
|
|
||||||
is small, fast and secure. Especially it results in small signatures in git.
|
|
||||||
|
|
||||||
@example
|
|
||||||
gpg --default-new-key-algo "ed25519/cert,sign+cv25519/encr" --quick-generate-key "human@@server.com"
|
|
||||||
@end example
|
|
||||||
|
|
||||||
When generating a key, make sure the email specified matches the email used in git as some sites like
|
|
||||||
github consider mismatches a reason to declare such commits unverified. After generating a key you
|
|
||||||
can add it to the MAINTAINER file and upload it to a keyserver.
|
|
||||||
|
|
||||||
@chapter Pre-push checklist
|
@chapter Pre-push checklist
|
||||||
|
|
||||||
Once you have a set of commits that you feel are ready for pushing,
|
Once you have a set of commits that you feel are ready for pushing,
|
||||||
|
|||||||
@@ -420,4 +420,4 @@ done:
|
|||||||
|
|
||||||
When all of this is done, you can submit your patch to the ffmpeg-devel
|
When all of this is done, you can submit your patch to the ffmpeg-devel
|
||||||
mailing-list for review. If you need any help, feel free to come on our IRC
|
mailing-list for review. If you need any help, feel free to come on our IRC
|
||||||
channel, #ffmpeg-devel on irc.libera.chat.
|
channel, #ffmpeg-devel on irc.freenode.net.
|
||||||
|
|||||||
@@ -529,7 +529,6 @@ static void ffmpeg_cleanup(int ret)
|
|||||||
ost->audio_channels_mapped = 0;
|
ost->audio_channels_mapped = 0;
|
||||||
|
|
||||||
av_dict_free(&ost->sws_dict);
|
av_dict_free(&ost->sws_dict);
|
||||||
av_dict_free(&ost->swr_opts);
|
|
||||||
|
|
||||||
avcodec_free_context(&ost->enc_ctx);
|
avcodec_free_context(&ost->enc_ctx);
|
||||||
avcodec_parameters_free(&ost->ref_par);
|
avcodec_parameters_free(&ost->ref_par);
|
||||||
@@ -790,7 +789,6 @@ static void output_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost)
|
|||||||
if (ost->nb_bitstream_filters) {
|
if (ost->nb_bitstream_filters) {
|
||||||
int idx;
|
int idx;
|
||||||
|
|
||||||
av_packet_split_side_data(pkt);
|
|
||||||
ret = av_bsf_send_packet(ost->bsf_ctx[0], pkt);
|
ret = av_bsf_send_packet(ost->bsf_ctx[0], pkt);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto finish;
|
goto finish;
|
||||||
@@ -2549,12 +2547,8 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eo
|
|||||||
ist->dts = ist->next_dts;
|
ist->dts = ist->next_dts;
|
||||||
switch (ist->dec_ctx->codec_type) {
|
switch (ist->dec_ctx->codec_type) {
|
||||||
case AVMEDIA_TYPE_AUDIO:
|
case AVMEDIA_TYPE_AUDIO:
|
||||||
if (ist->dec_ctx->sample_rate) {
|
ist->next_dts += ((int64_t)AV_TIME_BASE * ist->dec_ctx->frame_size) /
|
||||||
ist->next_dts += ((int64_t)AV_TIME_BASE * ist->dec_ctx->frame_size) /
|
ist->dec_ctx->sample_rate;
|
||||||
ist->dec_ctx->sample_rate;
|
|
||||||
} else {
|
|
||||||
ist->next_dts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case AVMEDIA_TYPE_VIDEO:
|
case AVMEDIA_TYPE_VIDEO:
|
||||||
if (ist->framerate.num) {
|
if (ist->framerate.num) {
|
||||||
@@ -3992,8 +3986,7 @@ static int seek_to_start(InputFile *ifile, AVFormatContext *is)
|
|||||||
ifile->time_base = ist->st->time_base;
|
ifile->time_base = ist->st->time_base;
|
||||||
/* the total duration of the stream, max_pts - min_pts is
|
/* the total duration of the stream, max_pts - min_pts is
|
||||||
* the duration of the stream without the last frame */
|
* the duration of the stream without the last frame */
|
||||||
if (ist->max_pts > ist->min_pts && ist->max_pts - (uint64_t)ist->min_pts < INT64_MAX - duration)
|
duration += ist->max_pts - ist->min_pts;
|
||||||
duration += ist->max_pts - ist->min_pts;
|
|
||||||
ifile->time_base = duration_max(duration, &ifile->duration, ist->st->time_base,
|
ifile->time_base = duration_max(duration, &ifile->duration, ist->st->time_base,
|
||||||
ifile->time_base);
|
ifile->time_base);
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-11
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* ffmpeg option parsing
|
* ffmpeg option parsing
|
||||||
*
|
*
|
||||||
@@ -2301,14 +2300,12 @@ loop_end:
|
|||||||
o->attachments[i]);
|
o->attachments[i]);
|
||||||
exit_program(1);
|
exit_program(1);
|
||||||
}
|
}
|
||||||
if (len > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE ||
|
if (!(attachment = av_malloc(len))) {
|
||||||
!(attachment = av_malloc(len + AV_INPUT_BUFFER_PADDING_SIZE))) {
|
av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
|
||||||
av_log(NULL, AV_LOG_FATAL, "Attachment %s too large.\n",
|
|
||||||
o->attachments[i]);
|
o->attachments[i]);
|
||||||
exit_program(1);
|
exit_program(1);
|
||||||
}
|
}
|
||||||
avio_read(pb, attachment, len);
|
avio_read(pb, attachment, len);
|
||||||
memset(attachment + len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
|
|
||||||
|
|
||||||
ost = new_attachment_stream(o, oc, -1);
|
ost = new_attachment_stream(o, oc, -1);
|
||||||
ost->stream_copy = 0;
|
ost->stream_copy = 0;
|
||||||
@@ -2635,14 +2632,13 @@ static int opt_target(void *optctx, const char *opt, const char *arg)
|
|||||||
} else {
|
} else {
|
||||||
/* Try to determine PAL/NTSC by peeking in the input files */
|
/* Try to determine PAL/NTSC by peeking in the input files */
|
||||||
if (nb_input_files) {
|
if (nb_input_files) {
|
||||||
int i, j;
|
int i, j, fr;
|
||||||
for (j = 0; j < nb_input_files; j++) {
|
for (j = 0; j < nb_input_files; j++) {
|
||||||
for (i = 0; i < input_files[j]->nb_streams; i++) {
|
for (i = 0; i < input_files[j]->nb_streams; i++) {
|
||||||
AVStream *st = input_files[j]->ctx->streams[i];
|
AVStream *st = input_files[j]->ctx->streams[i];
|
||||||
int64_t fr;
|
|
||||||
if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
|
if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
|
||||||
continue;
|
continue;
|
||||||
fr = st->time_base.den * 1000LL / st->time_base.num;
|
fr = st->time_base.den * 1000 / st->time_base.num;
|
||||||
if (fr == 25000) {
|
if (fr == 25000) {
|
||||||
norm = PAL;
|
norm = PAL;
|
||||||
break;
|
break;
|
||||||
@@ -3112,8 +3108,8 @@ enum OptGroup {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const OptionGroupDef groups[] = {
|
static const OptionGroupDef groups[] = {
|
||||||
[GROUP_OUTFILE] = { "output url", NULL, OPT_OUTPUT },
|
[GROUP_OUTFILE] = { "output file", NULL, OPT_OUTPUT },
|
||||||
[GROUP_INFILE] = { "input url", "i", OPT_INPUT },
|
[GROUP_INFILE] = { "input file", "i", OPT_INPUT },
|
||||||
};
|
};
|
||||||
|
|
||||||
static int open_files(OptionGroupList *l, const char *inout,
|
static int open_files(OptionGroupList *l, const char *inout,
|
||||||
@@ -3132,7 +3128,6 @@ static int open_files(OptionGroupList *l, const char *inout,
|
|||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
|
av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
|
||||||
"%s.\n", inout, g->arg);
|
"%s.\n", inout, g->arg);
|
||||||
uninit_options(&o);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -874,11 +874,11 @@ static int upload_texture(SDL_Texture *tex, AVFrame *frame, struct SwsContext **
|
|||||||
frame->width, frame->height, frame->format, frame->width, frame->height,
|
frame->width, frame->height, frame->format, frame->width, frame->height,
|
||||||
AV_PIX_FMT_BGRA, sws_flags, NULL, NULL, NULL);
|
AV_PIX_FMT_BGRA, sws_flags, NULL, NULL, NULL);
|
||||||
if (*img_convert_ctx != NULL) {
|
if (*img_convert_ctx != NULL) {
|
||||||
uint8_t *pixels[4];
|
uint8_t *pixels;
|
||||||
int pitch[4];
|
int pitch;
|
||||||
if (!SDL_LockTexture(tex, NULL, (void **)pixels, pitch)) {
|
if (!SDL_LockTexture(tex, NULL, (void **)&pixels, &pitch)) {
|
||||||
sws_scale(*img_convert_ctx, (const uint8_t * const *)frame->data, frame->linesize,
|
sws_scale(*img_convert_ctx, (const uint8_t * const *)frame->data, frame->linesize,
|
||||||
0, frame->height, pixels, pitch);
|
0, frame->height, &pixels, &pitch);
|
||||||
SDL_UnlockTexture(tex);
|
SDL_UnlockTexture(tex);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -904,8 +904,8 @@ static void video_image_display(VideoState *is)
|
|||||||
|
|
||||||
if (vp->pts >= sp->pts + ((float) sp->sub.start_display_time / 1000)) {
|
if (vp->pts >= sp->pts + ((float) sp->sub.start_display_time / 1000)) {
|
||||||
if (!sp->uploaded) {
|
if (!sp->uploaded) {
|
||||||
uint8_t* pixels[4];
|
uint8_t *pixels;
|
||||||
int pitch[4];
|
int pitch;
|
||||||
int i;
|
int i;
|
||||||
if (!sp->width || !sp->height) {
|
if (!sp->width || !sp->height) {
|
||||||
sp->width = vp->width;
|
sp->width = vp->width;
|
||||||
@@ -930,9 +930,9 @@ static void video_image_display(VideoState *is)
|
|||||||
av_log(NULL, AV_LOG_FATAL, "Cannot initialize the conversion context\n");
|
av_log(NULL, AV_LOG_FATAL, "Cannot initialize the conversion context\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!SDL_LockTexture(is->sub_texture, (SDL_Rect *)sub_rect, (void **)pixels, pitch)) {
|
if (!SDL_LockTexture(is->sub_texture, (SDL_Rect *)sub_rect, (void **)&pixels, &pitch)) {
|
||||||
sws_scale(is->sub_convert_ctx, (const uint8_t * const *)sub_rect->data, sub_rect->linesize,
|
sws_scale(is->sub_convert_ctx, (const uint8_t * const *)sub_rect->data, sub_rect->linesize,
|
||||||
0, sub_rect->h, pixels, pitch);
|
0, sub_rect->h, &pixels, &pitch);
|
||||||
SDL_UnlockTexture(is->sub_texture);
|
SDL_UnlockTexture(is->sub_texture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1789,56 +1789,6 @@ static void print_pkt_side_data(WriterContext *w,
|
|||||||
writer_print_section_footer(w);
|
writer_print_section_footer(w);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_color_range(WriterContext *w, enum AVColorRange color_range, const char *fallback)
|
|
||||||
{
|
|
||||||
const char *val = av_color_range_name(color_range);
|
|
||||||
if (!val || color_range == AVCOL_RANGE_UNSPECIFIED) {
|
|
||||||
print_str_opt("color_range", fallback);
|
|
||||||
} else {
|
|
||||||
print_str("color_range", val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void print_color_space(WriterContext *w, enum AVColorSpace color_space)
|
|
||||||
{
|
|
||||||
const char *val = av_color_space_name(color_space);
|
|
||||||
if (!val || color_space == AVCOL_SPC_UNSPECIFIED) {
|
|
||||||
print_str_opt("color_space", "unknown");
|
|
||||||
} else {
|
|
||||||
print_str("color_space", val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void print_primaries(WriterContext *w, enum AVColorPrimaries color_primaries)
|
|
||||||
{
|
|
||||||
const char *val = av_color_primaries_name(color_primaries);
|
|
||||||
if (!val || color_primaries == AVCOL_PRI_UNSPECIFIED) {
|
|
||||||
print_str_opt("color_primaries", "unknown");
|
|
||||||
} else {
|
|
||||||
print_str("color_primaries", val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void print_color_trc(WriterContext *w, enum AVColorTransferCharacteristic color_trc)
|
|
||||||
{
|
|
||||||
const char *val = av_color_transfer_name(color_trc);
|
|
||||||
if (!val || color_trc == AVCOL_TRC_UNSPECIFIED) {
|
|
||||||
print_str_opt("color_transfer", "unknown");
|
|
||||||
} else {
|
|
||||||
print_str("color_transfer", val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void print_chroma_location(WriterContext *w, enum AVChromaLocation chroma_location)
|
|
||||||
{
|
|
||||||
const char *val = av_chroma_location_name(chroma_location);
|
|
||||||
if (!val || chroma_location == AVCHROMA_LOC_UNSPECIFIED) {
|
|
||||||
print_str_opt("chroma_location", "unspecified");
|
|
||||||
} else {
|
|
||||||
print_str("chroma_location", val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void show_packet(WriterContext *w, InputFile *ifile, AVPacket *pkt, int packet_idx)
|
static void show_packet(WriterContext *w, InputFile *ifile, AVPacket *pkt, int packet_idx)
|
||||||
{
|
{
|
||||||
char val_str[128];
|
char val_str[128];
|
||||||
@@ -2294,12 +2244,29 @@ static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_id
|
|||||||
if (s) print_str ("pix_fmt", s);
|
if (s) print_str ("pix_fmt", s);
|
||||||
else print_str_opt("pix_fmt", "unknown");
|
else print_str_opt("pix_fmt", "unknown");
|
||||||
print_int("level", par->level);
|
print_int("level", par->level);
|
||||||
|
if (par->color_range != AVCOL_RANGE_UNSPECIFIED)
|
||||||
|
print_str ("color_range", av_color_range_name(par->color_range));
|
||||||
|
else
|
||||||
|
print_str_opt("color_range", "N/A");
|
||||||
|
|
||||||
print_color_range(w, par->color_range, "N/A");
|
s = av_get_colorspace_name(par->color_space);
|
||||||
print_color_space(w, par->color_space);
|
if (s) print_str ("color_space", s);
|
||||||
print_color_trc(w, par->color_trc);
|
else print_str_opt("color_space", "unknown");
|
||||||
print_primaries(w, par->color_primaries);
|
|
||||||
print_chroma_location(w, par->chroma_location);
|
if (par->color_trc != AVCOL_TRC_UNSPECIFIED)
|
||||||
|
print_str("color_transfer", av_color_transfer_name(par->color_trc));
|
||||||
|
else
|
||||||
|
print_str_opt("color_transfer", av_color_transfer_name(par->color_trc));
|
||||||
|
|
||||||
|
if (par->color_primaries != AVCOL_PRI_UNSPECIFIED)
|
||||||
|
print_str("color_primaries", av_color_primaries_name(par->color_primaries));
|
||||||
|
else
|
||||||
|
print_str_opt("color_primaries", av_color_primaries_name(par->color_primaries));
|
||||||
|
|
||||||
|
if (par->chroma_location != AVCHROMA_LOC_UNSPECIFIED)
|
||||||
|
print_str("chroma_location", av_chroma_location_name(par->chroma_location));
|
||||||
|
else
|
||||||
|
print_str_opt("chroma_location", av_chroma_location_name(par->chroma_location));
|
||||||
|
|
||||||
if (par->field_order == AV_FIELD_PROGRESSIVE)
|
if (par->field_order == AV_FIELD_PROGRESSIVE)
|
||||||
print_str("field_order", "progressive");
|
print_str("field_order", "progressive");
|
||||||
@@ -3344,12 +3311,6 @@ int main(int argc, char **argv)
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
w_name = av_strtok(print_format, "=", &buf);
|
w_name = av_strtok(print_format, "=", &buf);
|
||||||
if (!w_name) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR,
|
|
||||||
"No name specified for the output format\n");
|
|
||||||
ret = AVERROR(EINVAL);
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
w_args = buf;
|
w_args = buf;
|
||||||
|
|
||||||
if (show_data_hash) {
|
if (show_data_hash) {
|
||||||
|
|||||||
+1
-4
@@ -2702,10 +2702,8 @@ static int http_receive_data(HTTPContext *c)
|
|||||||
} else if (c->buffer_ptr - c->buffer >= 2 &&
|
} else if (c->buffer_ptr - c->buffer >= 2 &&
|
||||||
!memcmp(c->buffer_ptr - 1, "\r\n", 2)) {
|
!memcmp(c->buffer_ptr - 1, "\r\n", 2)) {
|
||||||
c->chunk_size = strtol(c->buffer, 0, 16);
|
c->chunk_size = strtol(c->buffer, 0, 16);
|
||||||
if (c->chunk_size <= 0) { // end of stream or invalid chunk size
|
if (c->chunk_size == 0) // end of stream
|
||||||
c->chunk_size = 0;
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
|
||||||
c->buffer_ptr = c->buffer;
|
c->buffer_ptr = c->buffer;
|
||||||
break;
|
break;
|
||||||
} else if (++loop_run > 10)
|
} else if (++loop_run > 10)
|
||||||
@@ -2727,7 +2725,6 @@ static int http_receive_data(HTTPContext *c)
|
|||||||
/* end of connection : close it */
|
/* end of connection : close it */
|
||||||
goto fail;
|
goto fail;
|
||||||
else {
|
else {
|
||||||
av_assert0(len <= c->chunk_size);
|
|
||||||
c->chunk_size -= len;
|
c->chunk_size -= len;
|
||||||
c->buffer_ptr += len;
|
c->buffer_ptr += len;
|
||||||
c->data_count += len;
|
c->data_count += len;
|
||||||
|
|||||||
@@ -323,8 +323,6 @@ done:
|
|||||||
av_dict_free(&recommended);
|
av_dict_free(&recommended);
|
||||||
av_stream_set_recommended_encoder_configuration(st, enc_config);
|
av_stream_set_recommended_encoder_configuration(st, enc_config);
|
||||||
st->codec = av;
|
st->codec = av;
|
||||||
st->codecpar = avcodec_parameters_alloc();
|
|
||||||
avcodec_parameters_from_context(st->codecpar, av);
|
|
||||||
stream->streams[stream->nb_streams++] = st;
|
stream->streams[stream->nb_streams++] = st;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-12
@@ -158,7 +158,7 @@ typedef struct FourXContext {
|
|||||||
#define FIX_1_847759065 121095
|
#define FIX_1_847759065 121095
|
||||||
#define FIX_2_613125930 171254
|
#define FIX_2_613125930 171254
|
||||||
|
|
||||||
#define MULTIPLY(var, const) ((int)((var) * (unsigned)(const)) >> 16)
|
#define MULTIPLY(var, const) (((var) * (const)) >> 16)
|
||||||
|
|
||||||
static void idct(int16_t block[64])
|
static void idct(int16_t block[64])
|
||||||
{
|
{
|
||||||
@@ -351,8 +351,6 @@ static int decode_p_block(FourXContext *f, uint16_t *dst, const uint16_t *src,
|
|||||||
index = size2index[log2h][log2w];
|
index = size2index[log2h][log2w];
|
||||||
av_assert0(index >= 0);
|
av_assert0(index >= 0);
|
||||||
|
|
||||||
if (get_bits_left(&f->gb) < 1)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
h = 1 << log2h;
|
h = 1 << log2h;
|
||||||
code = get_vlc2(&f->gb, block_type_vlc[1 - (f->version > 1)][index].table,
|
code = get_vlc2(&f->gb, block_type_vlc[1 - (f->version > 1)][index].table,
|
||||||
BLOCK_TYPE_VLC_BITS, 1);
|
BLOCK_TYPE_VLC_BITS, 1);
|
||||||
@@ -498,9 +496,9 @@ static int decode_i_block(FourXContext *f, int16_t *block)
|
|||||||
{
|
{
|
||||||
int code, i, j, level, val;
|
int code, i, j, level, val;
|
||||||
|
|
||||||
if (get_bits_left(&f->pre_gb) < 2) {
|
if (get_bits_left(&f->gb) < 2){
|
||||||
av_log(f->avctx, AV_LOG_ERROR, "%d bits left before decode_i_block()\n", get_bits_left(&f->pre_gb));
|
av_log(f->avctx, AV_LOG_ERROR, "%d bits left before decode_i_block()\n", get_bits_left(&f->gb));
|
||||||
return AVERROR_INVALIDDATA;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* DC coef */
|
/* DC coef */
|
||||||
@@ -525,10 +523,6 @@ static int decode_i_block(FourXContext *f, int16_t *block)
|
|||||||
break;
|
break;
|
||||||
if (code == 0xf0) {
|
if (code == 0xf0) {
|
||||||
i += 16;
|
i += 16;
|
||||||
if (i >= 64) {
|
|
||||||
av_log(f->avctx, AV_LOG_ERROR, "run %d overflow\n", i);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if (code & 0xf) {
|
if (code & 0xf) {
|
||||||
level = get_xbits(&f->gb, code & 0xf);
|
level = get_xbits(&f->gb, code & 0xf);
|
||||||
@@ -538,7 +532,7 @@ static int decode_i_block(FourXContext *f, int16_t *block)
|
|||||||
}
|
}
|
||||||
i += code >> 4;
|
i += code >> 4;
|
||||||
if (i >= 64) {
|
if (i >= 64) {
|
||||||
av_log(f->avctx, AV_LOG_ERROR, "run %d overflow\n", i);
|
av_log(f->avctx, AV_LOG_ERROR, "run %d oveflow\n", i);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -738,7 +732,7 @@ static int decode_i2_frame(FourXContext *f, const uint8_t *buf, int length)
|
|||||||
for (x = 0; x < width; x += 16) {
|
for (x = 0; x < width; x += 16) {
|
||||||
unsigned int color[4] = { 0 }, bits;
|
unsigned int color[4] = { 0 }, bits;
|
||||||
if (buf_end - buf < 8)
|
if (buf_end - buf < 8)
|
||||||
return AVERROR_INVALIDDATA;
|
return -1;
|
||||||
// warning following is purely guessed ...
|
// warning following is purely guessed ...
|
||||||
color[0] = bytestream2_get_le16u(&g3);
|
color[0] = bytestream2_get_le16u(&g3);
|
||||||
color[1] = bytestream2_get_le16u(&g3);
|
color[1] = bytestream2_get_le16u(&g3);
|
||||||
|
|||||||
+2
-8
@@ -70,9 +70,6 @@ static int decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
unsigned char *planemap = c->planemap;
|
unsigned char *planemap = c->planemap;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (buf_size < planes * height *2)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
|
if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@@ -125,15 +122,12 @@ static int decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (avctx->bits_per_coded_sample <= 8) {
|
if (avctx->bits_per_coded_sample <= 8) {
|
||||||
int size;
|
|
||||||
const uint8_t *pal = av_packet_get_side_data(avpkt,
|
const uint8_t *pal = av_packet_get_side_data(avpkt,
|
||||||
AV_PKT_DATA_PALETTE,
|
AV_PKT_DATA_PALETTE,
|
||||||
&size);
|
NULL);
|
||||||
if (pal && size == AVPALETTE_SIZE) {
|
if (pal) {
|
||||||
frame->palette_has_changed = 1;
|
frame->palette_has_changed = 1;
|
||||||
memcpy(c->pal, pal, AVPALETTE_SIZE);
|
memcpy(c->pal, pal, AVPALETTE_SIZE);
|
||||||
} else if (pal) {
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "Palette size %d is wrong\n", size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy (frame->data[1], c->pal, AVPALETTE_SIZE);
|
memcpy (frame->data[1], c->pal, AVPALETTE_SIZE);
|
||||||
|
|||||||
@@ -49,14 +49,14 @@ static int aac_adtstoasc_filter(AVBSFContext *bsfc, AVPacket *out)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (bsfc->par_in->extradata && in->size >= 2 && (AV_RB16(in->data) >> 4) != 0xfff)
|
|
||||||
goto finish;
|
|
||||||
|
|
||||||
if (in->size < AAC_ADTS_HEADER_SIZE)
|
if (in->size < AAC_ADTS_HEADER_SIZE)
|
||||||
goto packet_too_small;
|
goto packet_too_small;
|
||||||
|
|
||||||
init_get_bits(&gb, in->data, AAC_ADTS_HEADER_SIZE * 8);
|
init_get_bits(&gb, in->data, AAC_ADTS_HEADER_SIZE * 8);
|
||||||
|
|
||||||
|
if (bsfc->par_in->extradata && show_bits(&gb, 12) != 0xfff)
|
||||||
|
goto finish;
|
||||||
|
|
||||||
if (avpriv_aac_parse_header(&gb, &hdr) < 0) {
|
if (avpriv_aac_parse_header(&gb, &hdr) < 0) {
|
||||||
av_log(bsfc, AV_LOG_ERROR, "Error parsing ADTS frame header!\n");
|
av_log(bsfc, AV_LOG_ERROR, "Error parsing ADTS frame header!\n");
|
||||||
ret = AVERROR_INVALIDDATA;
|
ret = AVERROR_INVALIDDATA;
|
||||||
@@ -136,16 +136,8 @@ fail:
|
|||||||
|
|
||||||
static int aac_adtstoasc_init(AVBSFContext *ctx)
|
static int aac_adtstoasc_init(AVBSFContext *ctx)
|
||||||
{
|
{
|
||||||
/* Validate the extradata if the stream is already MPEG-4 AudioSpecificConfig */
|
av_freep(&ctx->par_out->extradata);
|
||||||
if (ctx->par_in->extradata) {
|
ctx->par_out->extradata_size = 0;
|
||||||
MPEG4AudioConfig mp4ac;
|
|
||||||
int ret = avpriv_mpeg4audio_get_config(&mp4ac, ctx->par_in->extradata,
|
|
||||||
ctx->par_in->extradata_size * 8, 1);
|
|
||||||
if (ret < 0) {
|
|
||||||
av_log(ctx, AV_LOG_ERROR, "Error parsing AudioSpecificConfig extradata!\n");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,6 @@
|
|||||||
#define AAC_RENAME(x) x ## _fixed
|
#define AAC_RENAME(x) x ## _fixed
|
||||||
#define AAC_RENAME_32(x) x ## _fixed_32
|
#define AAC_RENAME_32(x) x ## _fixed_32
|
||||||
typedef int INTFLOAT;
|
typedef int INTFLOAT;
|
||||||
typedef unsigned UINTFLOAT; ///< Equivalent to INTFLOAT, Used as temporal cast to avoid undefined sign overflow operations.
|
|
||||||
typedef int64_t INT64FLOAT;
|
typedef int64_t INT64FLOAT;
|
||||||
typedef int16_t SHORTFLOAT;
|
typedef int16_t SHORTFLOAT;
|
||||||
typedef SoftFloat AAC_FLOAT;
|
typedef SoftFloat AAC_FLOAT;
|
||||||
@@ -46,7 +45,7 @@ typedef int AAC_SIGNE;
|
|||||||
#define Q30(x) (int)((x)*1073741824.0 + 0.5)
|
#define Q30(x) (int)((x)*1073741824.0 + 0.5)
|
||||||
#define Q31(x) (int)((x)*2147483648.0 + 0.5)
|
#define Q31(x) (int)((x)*2147483648.0 + 0.5)
|
||||||
#define RANGE15(x) x
|
#define RANGE15(x) x
|
||||||
#define GET_GAIN(x, y) (-(y) * (1 << (x))) + 1024
|
#define GET_GAIN(x, y) (-(y) << (x)) + 1024
|
||||||
#define AAC_MUL16(x, y) (int)(((int64_t)(x) * (y) + 0x8000) >> 16)
|
#define AAC_MUL16(x, y) (int)(((int64_t)(x) * (y) + 0x8000) >> 16)
|
||||||
#define AAC_MUL26(x, y) (int)(((int64_t)(x) * (y) + 0x2000000) >> 26)
|
#define AAC_MUL26(x, y) (int)(((int64_t)(x) * (y) + 0x2000000) >> 26)
|
||||||
#define AAC_MUL30(x, y) (int)(((int64_t)(x) * (y) + 0x20000000) >> 30)
|
#define AAC_MUL30(x, y) (int)(((int64_t)(x) * (y) + 0x20000000) >> 30)
|
||||||
@@ -73,7 +72,7 @@ typedef int AAC_SIGNE;
|
|||||||
#define AAC_MSUB31_V3(x, y, z) (int)((((int64_t)(x) * (z)) - \
|
#define AAC_MSUB31_V3(x, y, z) (int)((((int64_t)(x) * (z)) - \
|
||||||
((int64_t)(y) * (z)) + \
|
((int64_t)(y) * (z)) + \
|
||||||
0x40000000) >> 31)
|
0x40000000) >> 31)
|
||||||
#define AAC_HALF_SUM(x, y) (((x) >> 1) + ((y) >> 1))
|
#define AAC_HALF_SUM(x, y) (x) >> 1 + (y) >> 1
|
||||||
#define AAC_SRA_R(x, y) (int)(((x) + (1 << ((y) - 1))) >> (y))
|
#define AAC_SRA_R(x, y) (int)(((x) + (1 << ((y) - 1))) >> (y))
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@@ -84,7 +83,6 @@ typedef int AAC_SIGNE;
|
|||||||
#define AAC_RENAME(x) x
|
#define AAC_RENAME(x) x
|
||||||
#define AAC_RENAME_32(x) x
|
#define AAC_RENAME_32(x) x
|
||||||
typedef float INTFLOAT;
|
typedef float INTFLOAT;
|
||||||
typedef float UINTFLOAT;
|
|
||||||
typedef float INT64FLOAT;
|
typedef float INT64FLOAT;
|
||||||
typedef float SHORTFLOAT;
|
typedef float SHORTFLOAT;
|
||||||
typedef float AAC_FLOAT;
|
typedef float AAC_FLOAT;
|
||||||
|
|||||||
@@ -843,25 +843,25 @@ static void search_for_ms(AACEncContext *s, ChannelElement *cpe)
|
|||||||
sce0->ics.swb_sizes[g],
|
sce0->ics.swb_sizes[g],
|
||||||
sce0->sf_idx[w*16+g],
|
sce0->sf_idx[w*16+g],
|
||||||
sce0->band_type[w*16+g],
|
sce0->band_type[w*16+g],
|
||||||
lambda / (band0->threshold + FLT_MIN), INFINITY, &b1, NULL, 0);
|
lambda / band0->threshold, INFINITY, &b1, NULL, 0);
|
||||||
dist1 += quantize_band_cost(s, &sce1->coeffs[start + (w+w2)*128],
|
dist1 += quantize_band_cost(s, &sce1->coeffs[start + (w+w2)*128],
|
||||||
R34,
|
R34,
|
||||||
sce1->ics.swb_sizes[g],
|
sce1->ics.swb_sizes[g],
|
||||||
sce1->sf_idx[w*16+g],
|
sce1->sf_idx[w*16+g],
|
||||||
sce1->band_type[w*16+g],
|
sce1->band_type[w*16+g],
|
||||||
lambda / (band1->threshold + FLT_MIN), INFINITY, &b2, NULL, 0);
|
lambda / band1->threshold, INFINITY, &b2, NULL, 0);
|
||||||
dist2 += quantize_band_cost(s, M,
|
dist2 += quantize_band_cost(s, M,
|
||||||
M34,
|
M34,
|
||||||
sce0->ics.swb_sizes[g],
|
sce0->ics.swb_sizes[g],
|
||||||
mididx,
|
mididx,
|
||||||
midcb,
|
midcb,
|
||||||
lambda / (minthr + FLT_MIN), INFINITY, &b3, NULL, 0);
|
lambda / minthr, INFINITY, &b3, NULL, 0);
|
||||||
dist2 += quantize_band_cost(s, S,
|
dist2 += quantize_band_cost(s, S,
|
||||||
S34,
|
S34,
|
||||||
sce1->ics.swb_sizes[g],
|
sce1->ics.swb_sizes[g],
|
||||||
sididx,
|
sididx,
|
||||||
sidcb,
|
sidcb,
|
||||||
mslambda / (minthr * bmax + FLT_MIN), INFINITY, &b4, NULL, 0);
|
mslambda / (minthr * bmax), INFINITY, &b4, NULL, 0);
|
||||||
B0 += b1+b2;
|
B0 += b1+b2;
|
||||||
B1 += b3+b4;
|
B1 += b3+b4;
|
||||||
dist1 -= b1+b2;
|
dist1 -= b1+b2;
|
||||||
|
|||||||
+3
-7
@@ -404,8 +404,6 @@ static int read_stream_mux_config(struct LATMContext *latmctx,
|
|||||||
} else {
|
} else {
|
||||||
int esc;
|
int esc;
|
||||||
do {
|
do {
|
||||||
if (get_bits_left(gb) < 9)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
esc = get_bits(gb, 1);
|
esc = get_bits(gb, 1);
|
||||||
skip_bits(gb, 8);
|
skip_bits(gb, 8);
|
||||||
} while (esc);
|
} while (esc);
|
||||||
@@ -426,8 +424,6 @@ static int read_payload_length_info(struct LATMContext *ctx, GetBitContext *gb)
|
|||||||
if (ctx->frame_length_type == 0) {
|
if (ctx->frame_length_type == 0) {
|
||||||
int mux_slot_length = 0;
|
int mux_slot_length = 0;
|
||||||
do {
|
do {
|
||||||
if (get_bits_left(gb) < 8)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
tmp = get_bits(gb, 8);
|
tmp = get_bits(gb, 8);
|
||||||
mux_slot_length += tmp;
|
mux_slot_length += tmp;
|
||||||
} while (tmp == 255);
|
} while (tmp == 255);
|
||||||
@@ -457,7 +453,7 @@ static int read_audio_mux_element(struct LATMContext *latmctx,
|
|||||||
}
|
}
|
||||||
if (latmctx->audio_mux_version_A == 0) {
|
if (latmctx->audio_mux_version_A == 0) {
|
||||||
int mux_slot_length_bytes = read_payload_length_info(latmctx, gb);
|
int mux_slot_length_bytes = read_payload_length_info(latmctx, gb);
|
||||||
if (mux_slot_length_bytes < 0 || mux_slot_length_bytes * 8LL > get_bits_left(gb)) {
|
if (mux_slot_length_bytes * 8 > get_bits_left(gb)) {
|
||||||
av_log(latmctx->aac_ctx.avctx, AV_LOG_ERROR, "incomplete frame\n");
|
av_log(latmctx->aac_ctx.avctx, AV_LOG_ERROR, "incomplete frame\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
} else if (mux_slot_length_bytes * 8 + 256 < get_bits_left(gb)) {
|
} else if (mux_slot_length_bytes * 8 + 256 < get_bits_left(gb)) {
|
||||||
@@ -556,7 +552,7 @@ AVCodec ff_aac_decoder = {
|
|||||||
AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE
|
AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE
|
||||||
},
|
},
|
||||||
.capabilities = AV_CODEC_CAP_CHANNEL_CONF | AV_CODEC_CAP_DR1,
|
.capabilities = AV_CODEC_CAP_CHANNEL_CONF | AV_CODEC_CAP_DR1,
|
||||||
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
|
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
|
||||||
.channel_layouts = aac_channel_layout,
|
.channel_layouts = aac_channel_layout,
|
||||||
.flush = flush,
|
.flush = flush,
|
||||||
.priv_class = &aac_decoder_class,
|
.priv_class = &aac_decoder_class,
|
||||||
@@ -581,7 +577,7 @@ AVCodec ff_aac_latm_decoder = {
|
|||||||
AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE
|
AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE
|
||||||
},
|
},
|
||||||
.capabilities = AV_CODEC_CAP_CHANNEL_CONF | AV_CODEC_CAP_DR1,
|
.capabilities = AV_CODEC_CAP_CHANNEL_CONF | AV_CODEC_CAP_DR1,
|
||||||
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
|
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
|
||||||
.channel_layouts = aac_channel_layout,
|
.channel_layouts = aac_channel_layout,
|
||||||
.flush = flush,
|
.flush = flush,
|
||||||
.profiles = NULL_IF_CONFIG_SMALL(ff_aac_profiles),
|
.profiles = NULL_IF_CONFIG_SMALL(ff_aac_profiles),
|
||||||
|
|||||||
+27
-47
@@ -125,7 +125,7 @@ static inline int *DEC_SQUAD(int *dst, unsigned idx)
|
|||||||
static inline int *DEC_UPAIR(int *dst, unsigned idx, unsigned sign)
|
static inline int *DEC_UPAIR(int *dst, unsigned idx, unsigned sign)
|
||||||
{
|
{
|
||||||
dst[0] = (idx & 15) * (1 - (sign & 0xFFFFFFFE));
|
dst[0] = (idx & 15) * (1 - (sign & 0xFFFFFFFE));
|
||||||
dst[1] = (idx >> 4 & 15) * (1 - ((sign & 1) * 2));
|
dst[1] = (idx >> 4 & 15) * (1 - ((sign & 1) << 1));
|
||||||
|
|
||||||
return dst + 2;
|
return dst + 2;
|
||||||
}
|
}
|
||||||
@@ -134,16 +134,16 @@ static inline int *DEC_UQUAD(int *dst, unsigned idx, unsigned sign)
|
|||||||
{
|
{
|
||||||
unsigned nz = idx >> 12;
|
unsigned nz = idx >> 12;
|
||||||
|
|
||||||
dst[0] = (idx & 3) * (1 + (((int)sign >> 31) * 2));
|
dst[0] = (idx & 3) * (1 + (((int)sign >> 31) << 1));
|
||||||
sign <<= nz & 1;
|
sign <<= nz & 1;
|
||||||
nz >>= 1;
|
nz >>= 1;
|
||||||
dst[1] = (idx >> 2 & 3) * (1 + (((int)sign >> 31) * 2));
|
dst[1] = (idx >> 2 & 3) * (1 + (((int)sign >> 31) << 1));
|
||||||
sign <<= nz & 1;
|
sign <<= nz & 1;
|
||||||
nz >>= 1;
|
nz >>= 1;
|
||||||
dst[2] = (idx >> 4 & 3) * (1 + (((int)sign >> 31) * 2));
|
dst[2] = (idx >> 4 & 3) * (1 + (((int)sign >> 31) << 1));
|
||||||
sign <<= nz & 1;
|
sign <<= nz & 1;
|
||||||
nz >>= 1;
|
nz >>= 1;
|
||||||
dst[3] = (idx >> 6 & 3) * (1 + (((int)sign >> 31) * 2));
|
dst[3] = (idx >> 6 & 3) * (1 + (((int)sign >> 31) << 1));
|
||||||
|
|
||||||
return dst + 4;
|
return dst + 4;
|
||||||
}
|
}
|
||||||
@@ -155,9 +155,9 @@ static void vector_pow43(int *coefs, int len)
|
|||||||
for (i=0; i<len; i++) {
|
for (i=0; i<len; i++) {
|
||||||
coef = coefs[i];
|
coef = coefs[i];
|
||||||
if (coef < 0)
|
if (coef < 0)
|
||||||
coef = -(int)ff_cbrt_tab_fixed[(-coef) & 8191];
|
coef = -(int)ff_cbrt_tab_fixed[-coef];
|
||||||
else
|
else
|
||||||
coef = (int)ff_cbrt_tab_fixed[ coef & 8191];
|
coef = (int)ff_cbrt_tab_fixed[coef];
|
||||||
coefs[i] = coef;
|
coefs[i] = coef;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -171,36 +171,31 @@ static void subband_scale(int *dst, int *src, int scale, int offset, int len)
|
|||||||
|
|
||||||
s = offset - (s >> 2);
|
s = offset - (s >> 2);
|
||||||
|
|
||||||
if (s > 31) {
|
if (s > 0) {
|
||||||
for (i=0; i<len; i++) {
|
|
||||||
dst[i] = 0;
|
|
||||||
}
|
|
||||||
} else if (s > 0) {
|
|
||||||
round = 1 << (s-1);
|
round = 1 << (s-1);
|
||||||
for (i=0; i<len; i++) {
|
for (i=0; i<len; i++) {
|
||||||
out = (int)(((int64_t)src[i] * c) >> 32);
|
out = (int)(((int64_t)src[i] * c) >> 32);
|
||||||
dst[i] = ((int)(out+round) >> s) * ssign;
|
dst[i] = ((int)(out+round) >> s) * ssign;
|
||||||
}
|
}
|
||||||
} else if (s > -32) {
|
}
|
||||||
|
else {
|
||||||
s = s + 32;
|
s = s + 32;
|
||||||
round = 1 << (s-1);
|
round = 1 << (s-1);
|
||||||
for (i=0; i<len; i++) {
|
for (i=0; i<len; i++) {
|
||||||
out = (int)((int64_t)((int64_t)src[i] * c + round) >> s);
|
out = (int)((int64_t)((int64_t)src[i] * c + round) >> s);
|
||||||
dst[i] = out * (unsigned)ssign;
|
dst[i] = out * ssign;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "Overflow in subband_scale()\n");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void noise_scale(int *coefs, int scale, int band_energy, int len)
|
static void noise_scale(int *coefs, int scale, int band_energy, int len)
|
||||||
{
|
{
|
||||||
int s = -scale;
|
int ssign = scale < 0 ? -1 : 1;
|
||||||
|
int s = FFABS(scale);
|
||||||
unsigned int round;
|
unsigned int round;
|
||||||
int i, out, c = exp2tab[s & 3];
|
int i, out, c = exp2tab[s & 3];
|
||||||
int nlz = 0;
|
int nlz = 0;
|
||||||
|
|
||||||
av_assert0(s >= 0);
|
|
||||||
while (band_energy > 0x7fff) {
|
while (band_energy > 0x7fff) {
|
||||||
band_energy >>= 1;
|
band_energy >>= 1;
|
||||||
nlz++;
|
nlz++;
|
||||||
@@ -208,28 +203,19 @@ static void noise_scale(int *coefs, int scale, int band_energy, int len)
|
|||||||
c /= band_energy;
|
c /= band_energy;
|
||||||
s = 21 + nlz - (s >> 2);
|
s = 21 + nlz - (s >> 2);
|
||||||
|
|
||||||
if (s > 31) {
|
if (s > 0) {
|
||||||
for (i=0; i<len; i++) {
|
round = 1 << (s-1);
|
||||||
coefs[i] = 0;
|
|
||||||
}
|
|
||||||
} else if (s >= 0) {
|
|
||||||
round = s ? 1 << (s-1) : 0;
|
|
||||||
for (i=0; i<len; i++) {
|
for (i=0; i<len; i++) {
|
||||||
out = (int)(((int64_t)coefs[i] * c) >> 32);
|
out = (int)(((int64_t)coefs[i] * c) >> 32);
|
||||||
coefs[i] = -((int)(out+round) >> s);
|
coefs[i] = ((int)(out+round) >> s) * ssign;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
s = s + 32;
|
s = s + 32;
|
||||||
if (s > 0) {
|
round = 1 << (s-1);
|
||||||
round = 1 << (s-1);
|
for (i=0; i<len; i++) {
|
||||||
for (i=0; i<len; i++) {
|
out = (int)((int64_t)((int64_t)coefs[i] * c + round) >> s);
|
||||||
out = (int)((int64_t)((int64_t)coefs[i] * c + round) >> s);
|
coefs[i] = out * ssign;
|
||||||
coefs[i] = -out;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (i=0; i<len; i++)
|
|
||||||
coefs[i] = -(int64_t)coefs[i] * c * (1 << -s);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -310,12 +296,8 @@ static av_always_inline void predict(PredictorState *ps, int *coef,
|
|||||||
if (output_enable) {
|
if (output_enable) {
|
||||||
int shift = 28 - pv.exp;
|
int shift = 28 - pv.exp;
|
||||||
|
|
||||||
if (shift < 31) {
|
if (shift < 31)
|
||||||
if (shift > 0) {
|
*coef += (pv.mant + (1 << (shift - 1))) >> shift;
|
||||||
*coef += (unsigned)((pv.mant + (1 << (shift - 1))) >> shift);
|
|
||||||
} else
|
|
||||||
*coef += (unsigned)pv.mant << -shift;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
e0 = av_int2sf(*coef, 2);
|
e0 = av_int2sf(*coef, 2);
|
||||||
@@ -380,9 +362,7 @@ static void apply_dependent_coupling_fixed(AACContext *ac,
|
|||||||
shift = (gain-1024) >> 3;
|
shift = (gain-1024) >> 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shift < -31) {
|
if (shift < 0) {
|
||||||
// Nothing to do
|
|
||||||
} else if (shift < 0) {
|
|
||||||
shift = -shift;
|
shift = -shift;
|
||||||
round = 1 << (shift - 1);
|
round = 1 << (shift - 1);
|
||||||
|
|
||||||
@@ -390,7 +370,7 @@ static void apply_dependent_coupling_fixed(AACContext *ac,
|
|||||||
for (k = offsets[i]; k < offsets[i + 1]; k++) {
|
for (k = offsets[i]; k < offsets[i + 1]; k++) {
|
||||||
tmp = (int)(((int64_t)src[group * 128 + k] * c + \
|
tmp = (int)(((int64_t)src[group * 128 + k] * c + \
|
||||||
(int64_t)0x1000000000) >> 37);
|
(int64_t)0x1000000000) >> 37);
|
||||||
dest[group * 128 + k] += (tmp + (int64_t)round) >> shift;
|
dest[group * 128 + k] += (tmp + round) >> shift;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -399,7 +379,7 @@ static void apply_dependent_coupling_fixed(AACContext *ac,
|
|||||||
for (k = offsets[i]; k < offsets[i + 1]; k++) {
|
for (k = offsets[i]; k < offsets[i + 1]; k++) {
|
||||||
tmp = (int)(((int64_t)src[group * 128 + k] * c + \
|
tmp = (int)(((int64_t)src[group * 128 + k] * c + \
|
||||||
(int64_t)0x1000000000) >> 37);
|
(int64_t)0x1000000000) >> 37);
|
||||||
dest[group * 128 + k] += tmp * (1U << shift);
|
dest[group * 128 + k] += tmp << shift;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -422,7 +402,7 @@ static void apply_independent_coupling_fixed(AACContext *ac,
|
|||||||
int i, c, shift, round, tmp;
|
int i, c, shift, round, tmp;
|
||||||
const int gain = cce->coup.gain[index][0];
|
const int gain = cce->coup.gain[index][0];
|
||||||
const int *src = cce->ch[0].ret;
|
const int *src = cce->ch[0].ret;
|
||||||
unsigned int *dest = target->ret;
|
int *dest = target->ret;
|
||||||
const int len = 1024 << (ac->oc[1].m4ac.sbr == 1);
|
const int len = 1024 << (ac->oc[1].m4ac.sbr == 1);
|
||||||
|
|
||||||
c = cce_scale_fixed[gain & 7];
|
c = cce_scale_fixed[gain & 7];
|
||||||
@@ -439,7 +419,7 @@ static void apply_independent_coupling_fixed(AACContext *ac,
|
|||||||
else {
|
else {
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
tmp = (int)(((int64_t)src[i] * c + (int64_t)0x1000000000) >> 37);
|
tmp = (int)(((int64_t)src[i] * c + (int64_t)0x1000000000) >> 37);
|
||||||
dest[i] += tmp * (1U << shift);
|
dest[i] += tmp << shift;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -406,15 +406,11 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
|
|||||||
/**
|
/**
|
||||||
* Save current output configuration if and only if it has been locked.
|
* Save current output configuration if and only if it has been locked.
|
||||||
*/
|
*/
|
||||||
static int push_output_configuration(AACContext *ac) {
|
static void push_output_configuration(AACContext *ac) {
|
||||||
int pushed = 0;
|
|
||||||
|
|
||||||
if (ac->oc[1].status == OC_LOCKED || ac->oc[0].status == OC_NONE) {
|
if (ac->oc[1].status == OC_LOCKED || ac->oc[0].status == OC_NONE) {
|
||||||
ac->oc[0] = ac->oc[1];
|
ac->oc[0] = ac->oc[1];
|
||||||
pushed = 1;
|
|
||||||
}
|
}
|
||||||
ac->oc[1].status = OC_NONE;
|
ac->oc[1].status = OC_NONE;
|
||||||
return pushed;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1118,9 +1114,6 @@ static av_cold int aac_decode_init(AVCodecContext *avctx)
|
|||||||
AACContext *ac = avctx->priv_data;
|
AACContext *ac = avctx->priv_data;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (avctx->sample_rate > 96000)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
ret = ff_thread_once(&aac_table_init, &aac_static_table_init);
|
ret = ff_thread_once(&aac_table_init, &aac_static_table_init);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return AVERROR_UNKNOWN;
|
return AVERROR_UNKNOWN;
|
||||||
@@ -1262,8 +1255,6 @@ static int decode_ics_info(AACContext *ac, IndividualChannelStream *ics,
|
|||||||
const MPEG4AudioConfig *const m4ac = &ac->oc[1].m4ac;
|
const MPEG4AudioConfig *const m4ac = &ac->oc[1].m4ac;
|
||||||
const int aot = m4ac->object_type;
|
const int aot = m4ac->object_type;
|
||||||
const int sampling_index = m4ac->sampling_index;
|
const int sampling_index = m4ac->sampling_index;
|
||||||
int ret_fail = AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
if (aot != AOT_ER_AAC_ELD) {
|
if (aot != AOT_ER_AAC_ELD) {
|
||||||
if (get_bits1(gb)) {
|
if (get_bits1(gb)) {
|
||||||
av_log(ac->avctx, AV_LOG_ERROR, "Reserved bit set.\n");
|
av_log(ac->avctx, AV_LOG_ERROR, "Reserved bit set.\n");
|
||||||
@@ -1314,10 +1305,8 @@ static int decode_ics_info(AACContext *ac, IndividualChannelStream *ics,
|
|||||||
ics->num_swb = ff_aac_num_swb_512[sampling_index];
|
ics->num_swb = ff_aac_num_swb_512[sampling_index];
|
||||||
ics->tns_max_bands = ff_tns_max_bands_512[sampling_index];
|
ics->tns_max_bands = ff_tns_max_bands_512[sampling_index];
|
||||||
}
|
}
|
||||||
if (!ics->num_swb || !ics->swb_offset) {
|
if (!ics->num_swb || !ics->swb_offset)
|
||||||
ret_fail = AVERROR_BUG;
|
return AVERROR_BUG;
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
ics->swb_offset = ff_swb_offset_1024[sampling_index];
|
ics->swb_offset = ff_swb_offset_1024[sampling_index];
|
||||||
ics->num_swb = ff_aac_num_swb_1024[sampling_index];
|
ics->num_swb = ff_aac_num_swb_1024[sampling_index];
|
||||||
@@ -1341,8 +1330,7 @@ static int decode_ics_info(AACContext *ac, IndividualChannelStream *ics,
|
|||||||
if (aot == AOT_ER_AAC_LD) {
|
if (aot == AOT_ER_AAC_LD) {
|
||||||
av_log(ac->avctx, AV_LOG_ERROR,
|
av_log(ac->avctx, AV_LOG_ERROR,
|
||||||
"LTP in ER AAC LD not yet implemented.\n");
|
"LTP in ER AAC LD not yet implemented.\n");
|
||||||
ret_fail = AVERROR_PATCHWELCOME;
|
return AVERROR_PATCHWELCOME;
|
||||||
goto fail;
|
|
||||||
}
|
}
|
||||||
if ((ics->ltp.present = get_bits(gb, 1)))
|
if ((ics->ltp.present = get_bits(gb, 1)))
|
||||||
decode_ltp(&ics->ltp, gb, ics->max_sfb);
|
decode_ltp(&ics->ltp, gb, ics->max_sfb);
|
||||||
@@ -1361,7 +1349,7 @@ static int decode_ics_info(AACContext *ac, IndividualChannelStream *ics,
|
|||||||
return 0;
|
return 0;
|
||||||
fail:
|
fail:
|
||||||
ics->max_sfb = 0;
|
ics->max_sfb = 0;
|
||||||
return ret_fail;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1621,24 +1609,25 @@ static int decode_spectrum_and_dequant(AACContext *ac, INTFLOAT coef[1024],
|
|||||||
}
|
}
|
||||||
} else if (cbt_m1 == NOISE_BT - 1) {
|
} else if (cbt_m1 == NOISE_BT - 1) {
|
||||||
for (group = 0; group < (AAC_SIGNE)g_len; group++, cfo+=128) {
|
for (group = 0; group < (AAC_SIGNE)g_len; group++, cfo+=128) {
|
||||||
|
#if !USE_FIXED
|
||||||
|
float scale;
|
||||||
|
#endif /* !USE_FIXED */
|
||||||
INTFLOAT band_energy;
|
INTFLOAT band_energy;
|
||||||
#if USE_FIXED
|
|
||||||
for (k = 0; k < off_len; k++) {
|
for (k = 0; k < off_len; k++) {
|
||||||
ac->random_state = lcg_random(ac->random_state);
|
ac->random_state = lcg_random(ac->random_state);
|
||||||
|
#if USE_FIXED
|
||||||
cfo[k] = ac->random_state >> 3;
|
cfo[k] = ac->random_state >> 3;
|
||||||
|
#else
|
||||||
|
cfo[k] = ac->random_state;
|
||||||
|
#endif /* USE_FIXED */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if USE_FIXED
|
||||||
band_energy = ac->fdsp->scalarproduct_fixed(cfo, cfo, off_len);
|
band_energy = ac->fdsp->scalarproduct_fixed(cfo, cfo, off_len);
|
||||||
band_energy = fixed_sqrt(band_energy, 31);
|
band_energy = fixed_sqrt(band_energy, 31);
|
||||||
noise_scale(cfo, sf[idx], band_energy, off_len);
|
noise_scale(cfo, sf[idx], band_energy, off_len);
|
||||||
#else
|
#else
|
||||||
float scale;
|
|
||||||
|
|
||||||
for (k = 0; k < off_len; k++) {
|
|
||||||
ac->random_state = lcg_random(ac->random_state);
|
|
||||||
cfo[k] = ac->random_state;
|
|
||||||
}
|
|
||||||
|
|
||||||
band_energy = ac->fdsp->scalarproduct_float(cfo, cfo, off_len);
|
band_energy = ac->fdsp->scalarproduct_float(cfo, cfo, off_len);
|
||||||
scale = sf[idx] / sqrtf(band_energy);
|
scale = sf[idx] / sqrtf(band_energy);
|
||||||
ac->fdsp->vector_fmul_scalar(cfo, cfo, scale, off_len);
|
ac->fdsp->vector_fmul_scalar(cfo, cfo, scale, off_len);
|
||||||
@@ -1947,17 +1936,16 @@ static int decode_ics(AACContext *ac, SingleChannelElement *sce,
|
|||||||
global_gain = get_bits(gb, 8);
|
global_gain = get_bits(gb, 8);
|
||||||
|
|
||||||
if (!common_window && !scale_flag) {
|
if (!common_window && !scale_flag) {
|
||||||
ret = decode_ics_info(ac, ics, gb);
|
if (decode_ics_info(ac, ics, gb) < 0)
|
||||||
if (ret < 0)
|
return AVERROR_INVALIDDATA;
|
||||||
goto fail;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ret = decode_band_types(ac, sce->band_type,
|
if ((ret = decode_band_types(ac, sce->band_type,
|
||||||
sce->band_type_run_end, gb, ics)) < 0)
|
sce->band_type_run_end, gb, ics)) < 0)
|
||||||
goto fail;
|
return ret;
|
||||||
if ((ret = decode_scalefactors(ac, sce->sf, gb, global_gain, ics,
|
if ((ret = decode_scalefactors(ac, sce->sf, gb, global_gain, ics,
|
||||||
sce->band_type, sce->band_type_run_end)) < 0)
|
sce->band_type, sce->band_type_run_end)) < 0)
|
||||||
goto fail;
|
return ret;
|
||||||
|
|
||||||
pulse_present = 0;
|
pulse_present = 0;
|
||||||
if (!scale_flag) {
|
if (!scale_flag) {
|
||||||
@@ -1965,48 +1953,37 @@ static int decode_ics(AACContext *ac, SingleChannelElement *sce,
|
|||||||
if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
|
if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
|
||||||
av_log(ac->avctx, AV_LOG_ERROR,
|
av_log(ac->avctx, AV_LOG_ERROR,
|
||||||
"Pulse tool not allowed in eight short sequence.\n");
|
"Pulse tool not allowed in eight short sequence.\n");
|
||||||
ret = AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
goto fail;
|
|
||||||
}
|
}
|
||||||
if (decode_pulses(&pulse, gb, ics->swb_offset, ics->num_swb)) {
|
if (decode_pulses(&pulse, gb, ics->swb_offset, ics->num_swb)) {
|
||||||
av_log(ac->avctx, AV_LOG_ERROR,
|
av_log(ac->avctx, AV_LOG_ERROR,
|
||||||
"Pulse data corrupt or invalid.\n");
|
"Pulse data corrupt or invalid.\n");
|
||||||
ret = AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
goto fail;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tns->present = get_bits1(gb);
|
tns->present = get_bits1(gb);
|
||||||
if (tns->present && !er_syntax) {
|
if (tns->present && !er_syntax)
|
||||||
ret = decode_tns(ac, tns, gb, ics);
|
if (decode_tns(ac, tns, gb, ics) < 0)
|
||||||
if (ret < 0)
|
return AVERROR_INVALIDDATA;
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
if (!eld_syntax && get_bits1(gb)) {
|
if (!eld_syntax && get_bits1(gb)) {
|
||||||
avpriv_request_sample(ac->avctx, "SSR");
|
avpriv_request_sample(ac->avctx, "SSR");
|
||||||
ret = AVERROR_PATCHWELCOME;
|
return AVERROR_PATCHWELCOME;
|
||||||
goto fail;
|
|
||||||
}
|
}
|
||||||
// I see no textual basis in the spec for this occurring after SSR gain
|
// I see no textual basis in the spec for this occurring after SSR gain
|
||||||
// control, but this is what both reference and real implmentations do
|
// control, but this is what both reference and real implmentations do
|
||||||
if (tns->present && er_syntax) {
|
if (tns->present && er_syntax)
|
||||||
ret = decode_tns(ac, tns, gb, ics);
|
if (decode_tns(ac, tns, gb, ics) < 0)
|
||||||
if (ret < 0)
|
return AVERROR_INVALIDDATA;
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = decode_spectrum_and_dequant(ac, out, gb, sce->sf, pulse_present,
|
if (decode_spectrum_and_dequant(ac, out, gb, sce->sf, pulse_present,
|
||||||
&pulse, ics, sce->band_type);
|
&pulse, ics, sce->band_type) < 0)
|
||||||
if (ret < 0)
|
return AVERROR_INVALIDDATA;
|
||||||
goto fail;
|
|
||||||
|
|
||||||
if (ac->oc[1].m4ac.object_type == AOT_AAC_MAIN && !common_window)
|
if (ac->oc[1].m4ac.object_type == AOT_AAC_MAIN && !common_window)
|
||||||
apply_prediction(ac, sce);
|
apply_prediction(ac, sce);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
fail:
|
|
||||||
tns->present = 0;
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2178,11 +2155,7 @@ static int decode_cce(AACContext *ac, GetBitContext *gb, ChannelElement *che)
|
|||||||
coup->coupling_point += get_bits1(gb) || (coup->coupling_point >> 1);
|
coup->coupling_point += get_bits1(gb) || (coup->coupling_point >> 1);
|
||||||
|
|
||||||
sign = get_bits(gb, 1);
|
sign = get_bits(gb, 1);
|
||||||
#if USE_FIXED
|
scale = AAC_RENAME(cce_scale)[get_bits(gb, 2)];
|
||||||
scale = get_bits(gb, 2);
|
|
||||||
#else
|
|
||||||
scale = cce_scale[get_bits(gb, 2)];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if ((ret = decode_ics(ac, sce, gb, 0, 0)))
|
if ((ret = decode_ics(ac, sce, gb, 0, 0)))
|
||||||
return ret;
|
return ret;
|
||||||
@@ -2196,10 +2169,6 @@ static int decode_cce(AACContext *ac, GetBitContext *gb, ChannelElement *che)
|
|||||||
cge = coup->coupling_point == AFTER_IMDCT ? 1 : get_bits1(gb);
|
cge = coup->coupling_point == AFTER_IMDCT ? 1 : get_bits1(gb);
|
||||||
gain = cge ? get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60: 0;
|
gain = cge ? get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60: 0;
|
||||||
gain_cache = GET_GAIN(scale, gain);
|
gain_cache = GET_GAIN(scale, gain);
|
||||||
#if USE_FIXED
|
|
||||||
if ((abs(gain_cache)-1024) >> 3 > 30)
|
|
||||||
return AVERROR(ERANGE);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
if (coup->coupling_point == AFTER_IMDCT) {
|
if (coup->coupling_point == AFTER_IMDCT) {
|
||||||
coup->gain[c][0] = gain_cache;
|
coup->gain[c][0] = gain_cache;
|
||||||
@@ -2217,10 +2186,6 @@ static int decode_cce(AACContext *ac, GetBitContext *gb, ChannelElement *che)
|
|||||||
t >>= 1;
|
t >>= 1;
|
||||||
}
|
}
|
||||||
gain_cache = GET_GAIN(scale, t) * s;
|
gain_cache = GET_GAIN(scale, t) * s;
|
||||||
#if USE_FIXED
|
|
||||||
if ((abs(gain_cache)-1024) >> 3 > 30)
|
|
||||||
return AVERROR(ERANGE);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
coup->gain[c][idx] = gain_cache;
|
coup->gain[c][idx] = gain_cache;
|
||||||
@@ -2394,7 +2359,7 @@ static int decode_extension_payload(AACContext *ac, GetBitContext *gb, int cnt,
|
|||||||
* @param decode 1 if tool is used normally, 0 if tool is used in LTP.
|
* @param decode 1 if tool is used normally, 0 if tool is used in LTP.
|
||||||
* @param coef spectral coefficients
|
* @param coef spectral coefficients
|
||||||
*/
|
*/
|
||||||
static void apply_tns(INTFLOAT coef_param[1024], TemporalNoiseShaping *tns,
|
static void apply_tns(INTFLOAT coef[1024], TemporalNoiseShaping *tns,
|
||||||
IndividualChannelStream *ics, int decode)
|
IndividualChannelStream *ics, int decode)
|
||||||
{
|
{
|
||||||
const int mmm = FFMIN(ics->tns_max_bands, ics->max_sfb);
|
const int mmm = FFMIN(ics->tns_max_bands, ics->max_sfb);
|
||||||
@@ -2402,10 +2367,6 @@ static void apply_tns(INTFLOAT coef_param[1024], TemporalNoiseShaping *tns,
|
|||||||
int bottom, top, order, start, end, size, inc;
|
int bottom, top, order, start, end, size, inc;
|
||||||
INTFLOAT lpc[TNS_MAX_ORDER];
|
INTFLOAT lpc[TNS_MAX_ORDER];
|
||||||
INTFLOAT tmp[TNS_MAX_ORDER+1];
|
INTFLOAT tmp[TNS_MAX_ORDER+1];
|
||||||
UINTFLOAT *coef = coef_param;
|
|
||||||
|
|
||||||
if(!mmm)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (w = 0; w < ics->num_windows; w++) {
|
for (w = 0; w < ics->num_windows; w++) {
|
||||||
bottom = ics->num_swb;
|
bottom = ics->num_swb;
|
||||||
@@ -2435,7 +2396,7 @@ static void apply_tns(INTFLOAT coef_param[1024], TemporalNoiseShaping *tns,
|
|||||||
// ar filter
|
// ar filter
|
||||||
for (m = 0; m < size; m++, start += inc)
|
for (m = 0; m < size; m++, start += inc)
|
||||||
for (i = 1; i <= FFMIN(m, order); i++)
|
for (i = 1; i <= FFMIN(m, order); i++)
|
||||||
coef[start] -= AAC_MUL26((INTFLOAT)coef[start - i * inc], lpc[i - 1]);
|
coef[start] -= AAC_MUL26(coef[start - i * inc], lpc[i - 1]);
|
||||||
} else {
|
} else {
|
||||||
// ma filter
|
// ma filter
|
||||||
for (m = 0; m < size; m++, start += inc) {
|
for (m = 0; m < size; m++, start += inc) {
|
||||||
@@ -2505,7 +2466,7 @@ static void apply_ltp(AACContext *ac, SingleChannelElement *sce)
|
|||||||
for (sfb = 0; sfb < FFMIN(sce->ics.max_sfb, MAX_LTP_LONG_SFB); sfb++)
|
for (sfb = 0; sfb < FFMIN(sce->ics.max_sfb, MAX_LTP_LONG_SFB); sfb++)
|
||||||
if (ltp->used[sfb])
|
if (ltp->used[sfb])
|
||||||
for (i = offsets[sfb]; i < offsets[sfb + 1]; i++)
|
for (i = offsets[sfb]; i < offsets[sfb + 1]; i++)
|
||||||
sce->coeffs[i] += (UINTFLOAT)predFreq[i];
|
sce->coeffs[i] += predFreq[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2571,7 +2532,7 @@ static void imdct_and_windowing(AACContext *ac, SingleChannelElement *sce)
|
|||||||
ac->mdct.imdct_half(&ac->mdct, buf, in);
|
ac->mdct.imdct_half(&ac->mdct, buf, in);
|
||||||
#if USE_FIXED
|
#if USE_FIXED
|
||||||
for (i=0; i<1024; i++)
|
for (i=0; i<1024; i++)
|
||||||
buf[i] = (buf[i] + 4LL) >> 3;
|
buf[i] = (buf[i] + 4) >> 3;
|
||||||
#endif /* USE_FIXED */
|
#endif /* USE_FIXED */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2650,7 +2611,7 @@ static void imdct_and_windowing_ld(AACContext *ac, SingleChannelElement *sce)
|
|||||||
|
|
||||||
static void imdct_and_windowing_eld(AACContext *ac, SingleChannelElement *sce)
|
static void imdct_and_windowing_eld(AACContext *ac, SingleChannelElement *sce)
|
||||||
{
|
{
|
||||||
UINTFLOAT *in = sce->coeffs;
|
INTFLOAT *in = sce->coeffs;
|
||||||
INTFLOAT *out = sce->ret;
|
INTFLOAT *out = sce->ret;
|
||||||
INTFLOAT *saved = sce->saved;
|
INTFLOAT *saved = sce->saved;
|
||||||
INTFLOAT *buf = ac->buf_mdct;
|
INTFLOAT *buf = ac->buf_mdct;
|
||||||
@@ -3041,13 +3002,7 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
|
|||||||
case TYPE_PCE: {
|
case TYPE_PCE: {
|
||||||
uint8_t layout_map[MAX_ELEM_ID*4][3];
|
uint8_t layout_map[MAX_ELEM_ID*4][3];
|
||||||
int tags;
|
int tags;
|
||||||
|
push_output_configuration(ac);
|
||||||
int pushed = push_output_configuration(ac);
|
|
||||||
if (pce_found && !pushed) {
|
|
||||||
err = AVERROR_INVALIDDATA;
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
tags = decode_pce(avctx, &ac->oc[1].m4ac, layout_map, gb);
|
tags = decode_pce(avctx, &ac->oc[1].m4ac, layout_map, gb);
|
||||||
if (tags < 0) {
|
if (tags < 0) {
|
||||||
err = tags;
|
err = tags;
|
||||||
|
|||||||
+2
-3
@@ -28,7 +28,6 @@
|
|||||||
* TODOs:
|
* TODOs:
|
||||||
* add sane pulse detection
|
* add sane pulse detection
|
||||||
***********************************/
|
***********************************/
|
||||||
#include <float.h>
|
|
||||||
|
|
||||||
#include "libavutil/libm.h"
|
#include "libavutil/libm.h"
|
||||||
#include "libavutil/thread.h"
|
#include "libavutil/thread.h"
|
||||||
@@ -809,7 +808,7 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
|
|||||||
/* Not so fast though */
|
/* Not so fast though */
|
||||||
ratio = sqrtf(ratio);
|
ratio = sqrtf(ratio);
|
||||||
}
|
}
|
||||||
s->lambda = av_clipf(s->lambda * ratio, FLT_EPSILON, 65536.f);
|
s->lambda = FFMIN(s->lambda * ratio, 65536.f);
|
||||||
|
|
||||||
/* Keep iterating if we must reduce and lambda is in the sky */
|
/* Keep iterating if we must reduce and lambda is in the sky */
|
||||||
if (ratio > 0.9f && ratio < 1.1f) {
|
if (ratio > 0.9f && ratio < 1.1f) {
|
||||||
@@ -857,7 +856,7 @@ static av_cold int aac_encode_end(AVCodecContext *avctx)
|
|||||||
{
|
{
|
||||||
AACEncContext *s = avctx->priv_data;
|
AACEncContext *s = avctx->priv_data;
|
||||||
|
|
||||||
av_log(avctx, AV_LOG_INFO, "Qavg: %.3f\n", s->lambda_count ? s->lambda_sum / s->lambda_count : NAN);
|
av_log(avctx, AV_LOG_INFO, "Qavg: %.3f\n", s->lambda_sum / s->lambda_count);
|
||||||
|
|
||||||
ff_mdct_end(&s->mdct1024);
|
ff_mdct_end(&s->mdct1024);
|
||||||
ff_mdct_end(&s->mdct128);
|
ff_mdct_end(&s->mdct128);
|
||||||
|
|||||||
+41
-32
@@ -409,33 +409,33 @@ static void hybrid_synthesis(PSDSPContext *dsp, INTFLOAT out[2][38][64],
|
|||||||
memset(out[0][n], 0, 5*sizeof(out[0][n][0]));
|
memset(out[0][n], 0, 5*sizeof(out[0][n][0]));
|
||||||
memset(out[1][n], 0, 5*sizeof(out[1][n][0]));
|
memset(out[1][n], 0, 5*sizeof(out[1][n][0]));
|
||||||
for (i = 0; i < 12; i++) {
|
for (i = 0; i < 12; i++) {
|
||||||
out[0][n][0] += (UINTFLOAT)in[ i][n][0];
|
out[0][n][0] += in[ i][n][0];
|
||||||
out[1][n][0] += (UINTFLOAT)in[ i][n][1];
|
out[1][n][0] += in[ i][n][1];
|
||||||
}
|
}
|
||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
out[0][n][1] += (UINTFLOAT)in[12+i][n][0];
|
out[0][n][1] += in[12+i][n][0];
|
||||||
out[1][n][1] += (UINTFLOAT)in[12+i][n][1];
|
out[1][n][1] += in[12+i][n][1];
|
||||||
}
|
}
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
out[0][n][2] += (UINTFLOAT)in[20+i][n][0];
|
out[0][n][2] += in[20+i][n][0];
|
||||||
out[1][n][2] += (UINTFLOAT)in[20+i][n][1];
|
out[1][n][2] += in[20+i][n][1];
|
||||||
out[0][n][3] += (UINTFLOAT)in[24+i][n][0];
|
out[0][n][3] += in[24+i][n][0];
|
||||||
out[1][n][3] += (UINTFLOAT)in[24+i][n][1];
|
out[1][n][3] += in[24+i][n][1];
|
||||||
out[0][n][4] += (UINTFLOAT)in[28+i][n][0];
|
out[0][n][4] += in[28+i][n][0];
|
||||||
out[1][n][4] += (UINTFLOAT)in[28+i][n][1];
|
out[1][n][4] += in[28+i][n][1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dsp->hybrid_synthesis_deint(out, in + 27, 5, len);
|
dsp->hybrid_synthesis_deint(out, in + 27, 5, len);
|
||||||
} else {
|
} else {
|
||||||
for (n = 0; n < len; n++) {
|
for (n = 0; n < len; n++) {
|
||||||
out[0][n][0] = (UINTFLOAT)in[0][n][0] + in[1][n][0] + in[2][n][0] +
|
out[0][n][0] = in[0][n][0] + in[1][n][0] + in[2][n][0] +
|
||||||
(UINTFLOAT)in[3][n][0] + in[4][n][0] + in[5][n][0];
|
in[3][n][0] + in[4][n][0] + in[5][n][0];
|
||||||
out[1][n][0] = (UINTFLOAT)in[0][n][1] + in[1][n][1] + in[2][n][1] +
|
out[1][n][0] = in[0][n][1] + in[1][n][1] + in[2][n][1] +
|
||||||
(UINTFLOAT)in[3][n][1] + in[4][n][1] + in[5][n][1];
|
in[3][n][1] + in[4][n][1] + in[5][n][1];
|
||||||
out[0][n][1] = (UINTFLOAT)in[6][n][0] + in[7][n][0];
|
out[0][n][1] = in[6][n][0] + in[7][n][0];
|
||||||
out[1][n][1] = (UINTFLOAT)in[6][n][1] + in[7][n][1];
|
out[1][n][1] = in[6][n][1] + in[7][n][1];
|
||||||
out[0][n][2] = (UINTFLOAT)in[8][n][0] + in[9][n][0];
|
out[0][n][2] = in[8][n][0] + in[9][n][0];
|
||||||
out[1][n][2] = (UINTFLOAT)in[8][n][1] + in[9][n][1];
|
out[1][n][2] = in[8][n][1] + in[9][n][1];
|
||||||
}
|
}
|
||||||
dsp->hybrid_synthesis_deint(out, in + 7, 3, len);
|
dsp->hybrid_synthesis_deint(out, in + 7, 3, len);
|
||||||
}
|
}
|
||||||
@@ -499,13 +499,13 @@ static void map_idx_34_to_20(int8_t *par_mapped, const int8_t *par, int full)
|
|||||||
static void map_val_34_to_20(INTFLOAT par[PS_MAX_NR_IIDICC])
|
static void map_val_34_to_20(INTFLOAT par[PS_MAX_NR_IIDICC])
|
||||||
{
|
{
|
||||||
#if USE_FIXED
|
#if USE_FIXED
|
||||||
par[ 0] = (int)(((int64_t)(par[ 0] + (unsigned)(par[ 1]>>1)) * 1431655765 + \
|
par[ 0] = (int)(((int64_t)(par[ 0] + (par[ 1]>>1)) * 1431655765 + \
|
||||||
0x40000000) >> 31);
|
0x40000000) >> 31);
|
||||||
par[ 1] = (int)(((int64_t)((par[ 1]>>1) + (unsigned)par[ 2]) * 1431655765 + \
|
par[ 1] = (int)(((int64_t)((par[ 1]>>1) + par[ 2]) * 1431655765 + \
|
||||||
0x40000000) >> 31);
|
0x40000000) >> 31);
|
||||||
par[ 2] = (int)(((int64_t)(par[ 3] + (unsigned)(par[ 4]>>1)) * 1431655765 + \
|
par[ 2] = (int)(((int64_t)(par[ 3] + (par[ 4]>>1)) * 1431655765 + \
|
||||||
0x40000000) >> 31);
|
0x40000000) >> 31);
|
||||||
par[ 3] = (int)(((int64_t)((par[ 4]>>1) + (unsigned)par[ 5]) * 1431655765 + \
|
par[ 3] = (int)(((int64_t)((par[ 4]>>1) + par[ 5]) * 1431655765 + \
|
||||||
0x40000000) >> 31);
|
0x40000000) >> 31);
|
||||||
#else
|
#else
|
||||||
par[ 0] = (2*par[ 0] + par[ 1]) * 0.33333333f;
|
par[ 0] = (2*par[ 0] + par[ 1]) * 0.33333333f;
|
||||||
@@ -692,17 +692,26 @@ static void decorrelation(PSContext *ps, INTFLOAT (*out)[32][2], const INTFLOAT
|
|||||||
for (i = 0; i < NR_PAR_BANDS[is34]; i++) {
|
for (i = 0; i < NR_PAR_BANDS[is34]; i++) {
|
||||||
for (n = n0; n < nL; n++) {
|
for (n = n0; n < nL; n++) {
|
||||||
int decayed_peak;
|
int decayed_peak;
|
||||||
|
int denom;
|
||||||
|
|
||||||
decayed_peak = (int)(((int64_t)peak_decay_factor * \
|
decayed_peak = (int)(((int64_t)peak_decay_factor * \
|
||||||
peak_decay_nrg[i] + 0x40000000) >> 31);
|
peak_decay_nrg[i] + 0x40000000) >> 31);
|
||||||
peak_decay_nrg[i] = FFMAX(decayed_peak, power[i][n]);
|
peak_decay_nrg[i] = FFMAX(decayed_peak, power[i][n]);
|
||||||
power_smooth[i] += (power[i][n] + 2LL - power_smooth[i]) >> 2;
|
power_smooth[i] += (power[i][n] - power_smooth[i] + 2) >> 2;
|
||||||
peak_decay_diff_smooth[i] += (peak_decay_nrg[i] + 2LL - power[i][n] - \
|
peak_decay_diff_smooth[i] += (peak_decay_nrg[i] - power[i][n] - \
|
||||||
peak_decay_diff_smooth[i]) >> 2;
|
peak_decay_diff_smooth[i] + 2) >> 2;
|
||||||
|
denom = peak_decay_diff_smooth[i] + (peak_decay_diff_smooth[i] >> 1);
|
||||||
if (peak_decay_diff_smooth[i]) {
|
if (denom > power_smooth[i]) {
|
||||||
transient_gain[i][n] = FFMIN(power_smooth[i]*43691LL / peak_decay_diff_smooth[i], 1<<16);
|
int p = power_smooth[i];
|
||||||
} else
|
while (denom < 0x40000000) {
|
||||||
transient_gain[i][n] = 1 << 16;
|
denom <<= 1;
|
||||||
|
p <<= 1;
|
||||||
|
}
|
||||||
|
transient_gain[i][n] = p / (denom >> 16);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
transient_gain[i][n] = 1 << 16;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@@ -933,7 +942,7 @@ static void stereo_processing(PSContext *ps, INTFLOAT (*l)[32][2], INTFLOAT (*r)
|
|||||||
int stop = ps->border_position[e+1];
|
int stop = ps->border_position[e+1];
|
||||||
INTFLOAT width = Q30(1.f) / ((stop - start) ? (stop - start) : 1);
|
INTFLOAT width = Q30(1.f) / ((stop - start) ? (stop - start) : 1);
|
||||||
#if USE_FIXED
|
#if USE_FIXED
|
||||||
width = FFMIN(2U*width, INT_MAX);
|
width <<= 1;
|
||||||
#endif
|
#endif
|
||||||
b = k_to_i[k];
|
b = k_to_i[k];
|
||||||
h[0][0] = H11[0][e][b];
|
h[0][0] = H11[0][e][b];
|
||||||
@@ -966,7 +975,7 @@ static void stereo_processing(PSContext *ps, INTFLOAT (*l)[32][2], INTFLOAT (*r)
|
|||||||
h_step[1][3] = AAC_MSUB31_V3(H22[1][e+1][b], h[1][3], width);
|
h_step[1][3] = AAC_MSUB31_V3(H22[1][e+1][b], h[1][3], width);
|
||||||
}
|
}
|
||||||
ps->dsp.stereo_interpolate[!PS_BASELINE && ps->enable_ipdopd](
|
ps->dsp.stereo_interpolate[!PS_BASELINE && ps->enable_ipdopd](
|
||||||
l[k] + 1 + start, r[k] + 1 + start,
|
l[k] + start + 1, r[k] + start + 1,
|
||||||
h, h_step, stop - start);
|
h, h_step, stop - start);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,10 +54,10 @@ static void ps_hybrid_analysis_c(INTFLOAT (*out)[2], INTFLOAT (*in)[2],
|
|||||||
INT64FLOAT sum_im = (INT64FLOAT)filter[i][6][0] * in[6][1];
|
INT64FLOAT sum_im = (INT64FLOAT)filter[i][6][0] * in[6][1];
|
||||||
|
|
||||||
for (j = 0; j < 6; j++) {
|
for (j = 0; j < 6; j++) {
|
||||||
INT64FLOAT in0_re = in[j][0];
|
INTFLOAT in0_re = in[j][0];
|
||||||
INT64FLOAT in0_im = in[j][1];
|
INTFLOAT in0_im = in[j][1];
|
||||||
INT64FLOAT in1_re = in[12-j][0];
|
INTFLOAT in1_re = in[12-j][0];
|
||||||
INT64FLOAT in1_im = in[12-j][1];
|
INTFLOAT in1_im = in[12-j][1];
|
||||||
sum_re += (INT64FLOAT)filter[i][j][0] * (in0_re + in1_re) -
|
sum_re += (INT64FLOAT)filter[i][j][0] * (in0_re + in1_re) -
|
||||||
(INT64FLOAT)filter[i][j][1] * (in0_im - in1_im);
|
(INT64FLOAT)filter[i][j][1] * (in0_im - in1_im);
|
||||||
sum_im += (INT64FLOAT)filter[i][j][0] * (in0_im + in1_im) +
|
sum_im += (INT64FLOAT)filter[i][j][0] * (in0_im + in1_im) +
|
||||||
@@ -129,12 +129,12 @@ static void ps_decorrelate_c(INTFLOAT (*out)[2], INTFLOAT (*delay)[2],
|
|||||||
INTFLOAT apd_im = in_im;
|
INTFLOAT apd_im = in_im;
|
||||||
in_re = AAC_MSUB30(link_delay_re, fractional_delay_re,
|
in_re = AAC_MSUB30(link_delay_re, fractional_delay_re,
|
||||||
link_delay_im, fractional_delay_im);
|
link_delay_im, fractional_delay_im);
|
||||||
in_re -= (UINTFLOAT)a_re;
|
in_re -= a_re;
|
||||||
in_im = AAC_MADD30(link_delay_re, fractional_delay_im,
|
in_im = AAC_MADD30(link_delay_re, fractional_delay_im,
|
||||||
link_delay_im, fractional_delay_re);
|
link_delay_im, fractional_delay_re);
|
||||||
in_im -= (UINTFLOAT)a_im;
|
in_im -= a_im;
|
||||||
ap_delay[m][n+5][0] = apd_re + (UINTFLOAT)AAC_MUL31(ag[m], in_re);
|
ap_delay[m][n+5][0] = apd_re + AAC_MUL31(ag[m], in_re);
|
||||||
ap_delay[m][n+5][1] = apd_im + (UINTFLOAT)AAC_MUL31(ag[m], in_im);
|
ap_delay[m][n+5][1] = apd_im + AAC_MUL31(ag[m], in_im);
|
||||||
}
|
}
|
||||||
out[n][0] = AAC_MUL16(transient_gain[n], in_re);
|
out[n][0] = AAC_MUL16(transient_gain[n], in_re);
|
||||||
out[n][1] = AAC_MUL16(transient_gain[n], in_im);
|
out[n][1] = AAC_MUL16(transient_gain[n], in_im);
|
||||||
@@ -149,10 +149,10 @@ static void ps_stereo_interpolate_c(INTFLOAT (*l)[2], INTFLOAT (*r)[2],
|
|||||||
INTFLOAT h1 = h[0][1];
|
INTFLOAT h1 = h[0][1];
|
||||||
INTFLOAT h2 = h[0][2];
|
INTFLOAT h2 = h[0][2];
|
||||||
INTFLOAT h3 = h[0][3];
|
INTFLOAT h3 = h[0][3];
|
||||||
UINTFLOAT hs0 = h_step[0][0];
|
INTFLOAT hs0 = h_step[0][0];
|
||||||
UINTFLOAT hs1 = h_step[0][1];
|
INTFLOAT hs1 = h_step[0][1];
|
||||||
UINTFLOAT hs2 = h_step[0][2];
|
INTFLOAT hs2 = h_step[0][2];
|
||||||
UINTFLOAT hs3 = h_step[0][3];
|
INTFLOAT hs3 = h_step[0][3];
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
for (n = 0; n < len; n++) {
|
for (n = 0; n < len; n++) {
|
||||||
@@ -180,10 +180,10 @@ static void ps_stereo_interpolate_ipdopd_c(INTFLOAT (*l)[2], INTFLOAT (*r)[2],
|
|||||||
INTFLOAT h01 = h[0][1], h11 = h[1][1];
|
INTFLOAT h01 = h[0][1], h11 = h[1][1];
|
||||||
INTFLOAT h02 = h[0][2], h12 = h[1][2];
|
INTFLOAT h02 = h[0][2], h12 = h[1][2];
|
||||||
INTFLOAT h03 = h[0][3], h13 = h[1][3];
|
INTFLOAT h03 = h[0][3], h13 = h[1][3];
|
||||||
UINTFLOAT hs00 = h_step[0][0], hs10 = h_step[1][0];
|
INTFLOAT hs00 = h_step[0][0], hs10 = h_step[1][0];
|
||||||
UINTFLOAT hs01 = h_step[0][1], hs11 = h_step[1][1];
|
INTFLOAT hs01 = h_step[0][1], hs11 = h_step[1][1];
|
||||||
UINTFLOAT hs02 = h_step[0][2], hs12 = h_step[1][2];
|
INTFLOAT hs02 = h_step[0][2], hs12 = h_step[1][2];
|
||||||
UINTFLOAT hs03 = h_step[0][3], hs13 = h_step[1][3];
|
INTFLOAT hs03 = h_step[0][3], hs13 = h_step[1][3];
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
for (n = 0; n < len; n++) {
|
for (n = 0; n < len; n++) {
|
||||||
|
|||||||
+1
-4
@@ -308,9 +308,6 @@ static av_cold int psy_3gpp_init(FFPsyContext *ctx) {
|
|||||||
const int bandwidth = ctx->cutoff ? ctx->cutoff : AAC_CUTOFF(ctx->avctx);
|
const int bandwidth = ctx->cutoff ? ctx->cutoff : AAC_CUTOFF(ctx->avctx);
|
||||||
const float num_bark = calc_bark((float)bandwidth);
|
const float num_bark = calc_bark((float)bandwidth);
|
||||||
|
|
||||||
if (bandwidth <= 0)
|
|
||||||
return AVERROR(EINVAL);
|
|
||||||
|
|
||||||
ctx->model_priv_data = av_mallocz(sizeof(AacPsyContext));
|
ctx->model_priv_data = av_mallocz(sizeof(AacPsyContext));
|
||||||
if (!ctx->model_priv_data)
|
if (!ctx->model_priv_data)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
@@ -797,7 +794,7 @@ static void psy_3gpp_analyze_channel(FFPsyContext *ctx, int channel,
|
|||||||
|
|
||||||
if (pe < 1.15f * desired_pe) {
|
if (pe < 1.15f * desired_pe) {
|
||||||
/* 6.6.1.3.6 "Final threshold modification by linearization" */
|
/* 6.6.1.3.6 "Final threshold modification by linearization" */
|
||||||
norm_fac = norm_fac ? 1.0f / norm_fac : 0;
|
norm_fac = 1.0f / norm_fac;
|
||||||
for (w = 0; w < wi->num_windows*16; w += 16) {
|
for (w = 0; w < wi->num_windows*16; w += 16) {
|
||||||
for (g = 0; g < num_bands; g++) {
|
for (g = 0; g < num_bands; g++) {
|
||||||
AacPsyBand *band = &pch->band[w+g];
|
AacPsyBand *band = &pch->band[w+g];
|
||||||
|
|||||||
+12
-35
@@ -288,8 +288,6 @@ static void sbr_hf_inverse_filter(SBRDSPContext *dsp,
|
|||||||
shift = a00.exp;
|
shift = a00.exp;
|
||||||
if (shift >= 3)
|
if (shift >= 3)
|
||||||
alpha0[k][0] = 0x7fffffff;
|
alpha0[k][0] = 0x7fffffff;
|
||||||
else if (shift <= -30)
|
|
||||||
alpha0[k][0] = 0;
|
|
||||||
else {
|
else {
|
||||||
a00.mant <<= 1;
|
a00.mant <<= 1;
|
||||||
shift = 2-shift;
|
shift = 2-shift;
|
||||||
@@ -304,8 +302,6 @@ static void sbr_hf_inverse_filter(SBRDSPContext *dsp,
|
|||||||
shift = a01.exp;
|
shift = a01.exp;
|
||||||
if (shift >= 3)
|
if (shift >= 3)
|
||||||
alpha0[k][1] = 0x7fffffff;
|
alpha0[k][1] = 0x7fffffff;
|
||||||
else if (shift <= -30)
|
|
||||||
alpha0[k][1] = 0;
|
|
||||||
else {
|
else {
|
||||||
a01.mant <<= 1;
|
a01.mant <<= 1;
|
||||||
shift = 2-shift;
|
shift = 2-shift;
|
||||||
@@ -319,8 +315,6 @@ static void sbr_hf_inverse_filter(SBRDSPContext *dsp,
|
|||||||
shift = a10.exp;
|
shift = a10.exp;
|
||||||
if (shift >= 3)
|
if (shift >= 3)
|
||||||
alpha1[k][0] = 0x7fffffff;
|
alpha1[k][0] = 0x7fffffff;
|
||||||
else if (shift <= -30)
|
|
||||||
alpha1[k][0] = 0;
|
|
||||||
else {
|
else {
|
||||||
a10.mant <<= 1;
|
a10.mant <<= 1;
|
||||||
shift = 2-shift;
|
shift = 2-shift;
|
||||||
@@ -335,8 +329,6 @@ static void sbr_hf_inverse_filter(SBRDSPContext *dsp,
|
|||||||
shift = a11.exp;
|
shift = a11.exp;
|
||||||
if (shift >= 3)
|
if (shift >= 3)
|
||||||
alpha1[k][1] = 0x7fffffff;
|
alpha1[k][1] = 0x7fffffff;
|
||||||
else if (shift <= -30)
|
|
||||||
alpha1[k][1] = 0;
|
|
||||||
else {
|
else {
|
||||||
a11.mant <<= 1;
|
a11.mant <<= 1;
|
||||||
shift = 2-shift;
|
shift = 2-shift;
|
||||||
@@ -437,7 +429,6 @@ static void sbr_gain_calc(AACContext *ac, SpectralBandReplication *sbr,
|
|||||||
av_add_sf(FLOAT_1, sbr->e_curr[e][m]),
|
av_add_sf(FLOAT_1, sbr->e_curr[e][m]),
|
||||||
av_add_sf(FLOAT_1, sbr->q_mapped[e][m]))));
|
av_add_sf(FLOAT_1, sbr->q_mapped[e][m]))));
|
||||||
}
|
}
|
||||||
sbr->gain[e][m] = av_add_sf(sbr->gain[e][m], FLOAT_MIN);
|
|
||||||
}
|
}
|
||||||
for (m = sbr->f_tablelim[k] - sbr->kx[1]; m < sbr->f_tablelim[k + 1] - sbr->kx[1]; m++) {
|
for (m = sbr->f_tablelim[k] - sbr->kx[1]; m < sbr->f_tablelim[k + 1] - sbr->kx[1]; m++) {
|
||||||
sum[0] = av_add_sf(sum[0], sbr->e_origmapped[e][m]);
|
sum[0] = av_add_sf(sum[0], sbr->e_origmapped[e][m]);
|
||||||
@@ -571,39 +562,25 @@ static void sbr_hf_assemble(int Y1[38][64][2],
|
|||||||
int idx = indexsine&1;
|
int idx = indexsine&1;
|
||||||
int A = (1-((indexsine+(kx & 1))&2));
|
int A = (1-((indexsine+(kx & 1))&2));
|
||||||
int B = (A^(-idx)) + idx;
|
int B = (A^(-idx)) + idx;
|
||||||
unsigned *out = &Y1[i][kx][idx];
|
int *out = &Y1[i][kx][idx];
|
||||||
int shift;
|
int shift, round;
|
||||||
unsigned round;
|
|
||||||
|
|
||||||
SoftFloat *in = sbr->s_m[e];
|
SoftFloat *in = sbr->s_m[e];
|
||||||
for (m = 0; m+1 < m_max; m+=2) {
|
for (m = 0; m+1 < m_max; m+=2) {
|
||||||
int shift2;
|
shift = 22 - in[m ].exp;
|
||||||
shift = 22 - in[m ].exp;
|
round = 1 << (shift-1);
|
||||||
shift2= 22 - in[m+1].exp;
|
out[2*m ] += (in[m ].mant * A + round) >> shift;
|
||||||
if (shift < 1 || shift2 < 1) {
|
|
||||||
av_log(NULL, AV_LOG_ERROR, "Overflow in sbr_hf_assemble, shift=%d,%d\n", shift, shift2);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (shift < 32) {
|
|
||||||
round = 1 << (shift-1);
|
|
||||||
out[2*m ] += (int)(in[m ].mant * A + round) >> shift;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shift2 < 32) {
|
shift = 22 - in[m+1].exp;
|
||||||
round = 1 << (shift2-1);
|
round = 1 << (shift-1);
|
||||||
out[2*m+2] += (int)(in[m+1].mant * B + round) >> shift2;
|
out[2*m+2] += (in[m+1].mant * B + round) >> shift;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if(m_max&1)
|
if(m_max&1)
|
||||||
{
|
{
|
||||||
shift = 22 - in[m ].exp;
|
shift = 22 - in[m ].exp;
|
||||||
if (shift < 1) {
|
round = 1 << (shift-1);
|
||||||
av_log(NULL, AV_LOG_ERROR, "Overflow in sbr_hf_assemble, shift=%d\n", shift);
|
|
||||||
return;
|
out[2*m ] += (in[m ].mant * A + round) >> shift;
|
||||||
} else if (shift < 32) {
|
|
||||||
round = 1 << (shift-1);
|
|
||||||
out[2*m ] += (int)(in[m ].mant * A + round) >> shift;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
indexnoise = (indexnoise + m_max) & 0x1ff;
|
indexnoise = (indexnoise + m_max) & 0x1ff;
|
||||||
|
|||||||
@@ -623,26 +623,24 @@ static int read_sbr_grid(AACContext *ac, SpectralBandReplication *sbr,
|
|||||||
int abs_bord_trail = 16;
|
int abs_bord_trail = 16;
|
||||||
int num_rel_lead, num_rel_trail;
|
int num_rel_lead, num_rel_trail;
|
||||||
unsigned bs_num_env_old = ch_data->bs_num_env;
|
unsigned bs_num_env_old = ch_data->bs_num_env;
|
||||||
int bs_frame_class, bs_num_env;
|
|
||||||
|
|
||||||
ch_data->bs_freq_res[0] = ch_data->bs_freq_res[ch_data->bs_num_env];
|
ch_data->bs_freq_res[0] = ch_data->bs_freq_res[ch_data->bs_num_env];
|
||||||
ch_data->bs_amp_res = sbr->bs_amp_res_header;
|
ch_data->bs_amp_res = sbr->bs_amp_res_header;
|
||||||
ch_data->t_env_num_env_old = ch_data->t_env[bs_num_env_old];
|
ch_data->t_env_num_env_old = ch_data->t_env[bs_num_env_old];
|
||||||
|
|
||||||
switch (bs_frame_class = get_bits(gb, 2)) {
|
switch (ch_data->bs_frame_class = get_bits(gb, 2)) {
|
||||||
case FIXFIX:
|
case FIXFIX:
|
||||||
bs_num_env = 1 << get_bits(gb, 2);
|
ch_data->bs_num_env = 1 << get_bits(gb, 2);
|
||||||
if (bs_num_env > 4) {
|
|
||||||
av_log(ac->avctx, AV_LOG_ERROR,
|
|
||||||
"Invalid bitstream, too many SBR envelopes in FIXFIX type SBR frame: %d\n",
|
|
||||||
bs_num_env);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
ch_data->bs_num_env = bs_num_env;
|
|
||||||
num_rel_lead = ch_data->bs_num_env - 1;
|
num_rel_lead = ch_data->bs_num_env - 1;
|
||||||
if (ch_data->bs_num_env == 1)
|
if (ch_data->bs_num_env == 1)
|
||||||
ch_data->bs_amp_res = 0;
|
ch_data->bs_amp_res = 0;
|
||||||
|
|
||||||
|
if (ch_data->bs_num_env > 4) {
|
||||||
|
av_log(ac->avctx, AV_LOG_ERROR,
|
||||||
|
"Invalid bitstream, too many SBR envelopes in FIXFIX type SBR frame: %d\n",
|
||||||
|
ch_data->bs_num_env);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
ch_data->t_env[0] = 0;
|
ch_data->t_env[0] = 0;
|
||||||
ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
|
ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
|
||||||
@@ -690,15 +688,14 @@ static int read_sbr_grid(AACContext *ac, SpectralBandReplication *sbr,
|
|||||||
abs_bord_trail += get_bits(gb, 2);
|
abs_bord_trail += get_bits(gb, 2);
|
||||||
num_rel_lead = get_bits(gb, 2);
|
num_rel_lead = get_bits(gb, 2);
|
||||||
num_rel_trail = get_bits(gb, 2);
|
num_rel_trail = get_bits(gb, 2);
|
||||||
bs_num_env = num_rel_lead + num_rel_trail + 1;
|
ch_data->bs_num_env = num_rel_lead + num_rel_trail + 1;
|
||||||
|
|
||||||
if (bs_num_env > 5) {
|
if (ch_data->bs_num_env > 5) {
|
||||||
av_log(ac->avctx, AV_LOG_ERROR,
|
av_log(ac->avctx, AV_LOG_ERROR,
|
||||||
"Invalid bitstream, too many SBR envelopes in VARVAR type SBR frame: %d\n",
|
"Invalid bitstream, too many SBR envelopes in VARVAR type SBR frame: %d\n",
|
||||||
bs_num_env);
|
ch_data->bs_num_env);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
ch_data->bs_num_env = bs_num_env;
|
|
||||||
|
|
||||||
ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
|
ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
|
||||||
|
|
||||||
@@ -713,7 +710,6 @@ static int read_sbr_grid(AACContext *ac, SpectralBandReplication *sbr,
|
|||||||
get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env);
|
get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ch_data->bs_frame_class = bs_frame_class;
|
|
||||||
|
|
||||||
av_assert0(bs_pointer >= 0);
|
av_assert0(bs_pointer >= 0);
|
||||||
if (bs_pointer > ch_data->bs_num_env + 1) {
|
if (bs_pointer > ch_data->bs_num_env + 1) {
|
||||||
|
|||||||
+17
-17
@@ -104,26 +104,26 @@ static int aasc_decode_frame(AVCodecContext *avctx,
|
|||||||
ff_msrle_decode(avctx, s->frame, 8, &s->gb);
|
ff_msrle_decode(avctx, s->frame, 8, &s->gb);
|
||||||
break;
|
break;
|
||||||
case MKTAG('A', 'A', 'S', 'C'):
|
case MKTAG('A', 'A', 'S', 'C'):
|
||||||
switch (compr) {
|
switch (compr) {
|
||||||
case 0:
|
case 0:
|
||||||
stride = (avctx->width * psize + psize) & ~psize;
|
stride = (avctx->width * psize + psize) & ~psize;
|
||||||
if (buf_size < stride * avctx->height)
|
if (buf_size < stride * avctx->height)
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
for (i = avctx->height - 1; i >= 0; i--) {
|
|
||||||
memcpy(s->frame->data[0] + i * s->frame->linesize[0], buf, avctx->width * psize);
|
|
||||||
buf += stride;
|
|
||||||
buf_size -= stride;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
bytestream2_init(&s->gb, buf, buf_size);
|
|
||||||
ff_msrle_decode(avctx, s->frame, 8, &s->gb);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "Unknown compression type %d\n", compr);
|
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
|
for (i = avctx->height - 1; i >= 0; i--) {
|
||||||
|
memcpy(s->frame->data[0] + i * s->frame->linesize[0], buf, avctx->width * psize);
|
||||||
|
buf += stride;
|
||||||
|
buf_size -= stride;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 1:
|
||||||
|
bytestream2_init(&s->gb, buf, buf_size);
|
||||||
|
ff_msrle_decode(avctx, s->frame, 8, &s->gb);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
av_log(avctx, AV_LOG_ERROR, "Unknown compression type %d\n", compr);
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
av_log(avctx, AV_LOG_ERROR, "Unknown FourCC: %X\n", avctx->codec_tag);
|
av_log(avctx, AV_LOG_ERROR, "Unknown FourCC: %X\n", avctx->codec_tag);
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
+13
-16
@@ -747,31 +747,30 @@ static void ac3_upmix_delay(AC3DecodeContext *s)
|
|||||||
* @param[in] default_band_struct default band structure table
|
* @param[in] default_band_struct default band structure table
|
||||||
* @param[out] num_bands number of bands (optionally NULL)
|
* @param[out] num_bands number of bands (optionally NULL)
|
||||||
* @param[out] band_sizes array containing the number of bins in each band (optionally NULL)
|
* @param[out] band_sizes array containing the number of bins in each band (optionally NULL)
|
||||||
* @param[in,out] band_struct current band structure
|
|
||||||
*/
|
*/
|
||||||
static void decode_band_structure(GetBitContext *gbc, int blk, int eac3,
|
static void decode_band_structure(GetBitContext *gbc, int blk, int eac3,
|
||||||
int ecpl, int start_subband, int end_subband,
|
int ecpl, int start_subband, int end_subband,
|
||||||
const uint8_t *default_band_struct,
|
const uint8_t *default_band_struct,
|
||||||
int *num_bands, uint8_t *band_sizes,
|
int *num_bands, uint8_t *band_sizes)
|
||||||
uint8_t *band_struct, int band_struct_size)
|
|
||||||
{
|
{
|
||||||
int subbnd, bnd, n_subbands, n_bands=0;
|
int subbnd, bnd, n_subbands, n_bands=0;
|
||||||
uint8_t bnd_sz[22];
|
uint8_t bnd_sz[22];
|
||||||
|
uint8_t coded_band_struct[22];
|
||||||
|
const uint8_t *band_struct;
|
||||||
|
|
||||||
n_subbands = end_subband - start_subband;
|
n_subbands = end_subband - start_subband;
|
||||||
|
|
||||||
if (!blk)
|
|
||||||
memcpy(band_struct, default_band_struct, band_struct_size);
|
|
||||||
|
|
||||||
av_assert0(band_struct_size >= start_subband + n_subbands);
|
|
||||||
|
|
||||||
band_struct += start_subband + 1;
|
|
||||||
|
|
||||||
/* decode band structure from bitstream or use default */
|
/* decode band structure from bitstream or use default */
|
||||||
if (!eac3 || get_bits1(gbc)) {
|
if (!eac3 || get_bits1(gbc)) {
|
||||||
for (subbnd = 0; subbnd < n_subbands - 1; subbnd++) {
|
for (subbnd = 0; subbnd < n_subbands - 1; subbnd++) {
|
||||||
band_struct[subbnd] = get_bits1(gbc);
|
coded_band_struct[subbnd] = get_bits1(gbc);
|
||||||
}
|
}
|
||||||
|
band_struct = coded_band_struct;
|
||||||
|
} else if (!blk) {
|
||||||
|
band_struct = &default_band_struct[start_subband+1];
|
||||||
|
} else {
|
||||||
|
/* no change in band structure */
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* calculate number of bands and band sizes based on band structure.
|
/* calculate number of bands and band sizes based on band structure.
|
||||||
@@ -898,8 +897,7 @@ static int decode_audio_block(AC3DecodeContext *s, int blk)
|
|||||||
start_subband, end_subband,
|
start_subband, end_subband,
|
||||||
ff_eac3_default_spx_band_struct,
|
ff_eac3_default_spx_band_struct,
|
||||||
&s->num_spx_bands,
|
&s->num_spx_bands,
|
||||||
s->spx_band_sizes,
|
s->spx_band_sizes);
|
||||||
s->spx_band_struct, sizeof(s->spx_band_struct));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!s->eac3 || !s->spx_in_use) {
|
if (!s->eac3 || !s->spx_in_use) {
|
||||||
@@ -1033,8 +1031,7 @@ static int decode_audio_block(AC3DecodeContext *s, int blk)
|
|||||||
decode_band_structure(gbc, blk, s->eac3, 0, cpl_start_subband,
|
decode_band_structure(gbc, blk, s->eac3, 0, cpl_start_subband,
|
||||||
cpl_end_subband,
|
cpl_end_subband,
|
||||||
ff_eac3_default_cpl_band_struct,
|
ff_eac3_default_cpl_band_struct,
|
||||||
&s->num_cpl_bands, s->cpl_band_sizes,
|
&s->num_cpl_bands, s->cpl_band_sizes);
|
||||||
s->cpl_band_struct, sizeof(s->cpl_band_struct));
|
|
||||||
} else {
|
} else {
|
||||||
/* coupling not in use */
|
/* coupling not in use */
|
||||||
for (ch = 1; ch <= fbw_channels; ch++) {
|
for (ch = 1; ch <= fbw_channels; ch++) {
|
||||||
@@ -1334,7 +1331,7 @@ static int decode_audio_block(AC3DecodeContext *s, int blk)
|
|||||||
for (ch = 1; ch <= s->channels; ch++) {
|
for (ch = 1; ch <= s->channels; ch++) {
|
||||||
int audio_channel = 0;
|
int audio_channel = 0;
|
||||||
INTFLOAT gain;
|
INTFLOAT gain;
|
||||||
if (s->channel_mode == AC3_CHMODE_DUALMONO && ch <= 2)
|
if (s->channel_mode == AC3_CHMODE_DUALMONO)
|
||||||
audio_channel = 2-ch;
|
audio_channel = 2-ch;
|
||||||
if (s->heavy_compression && s->compression_exists[audio_channel])
|
if (s->heavy_compression && s->compression_exists[audio_channel])
|
||||||
gain = s->heavy_dynamic_range[audio_channel];
|
gain = s->heavy_dynamic_range[audio_channel];
|
||||||
|
|||||||
@@ -128,7 +128,6 @@ typedef struct AC3DecodeContext {
|
|||||||
int phase_flags_in_use; ///< phase flags in use (phsflginu)
|
int phase_flags_in_use; ///< phase flags in use (phsflginu)
|
||||||
int phase_flags[AC3_MAX_CPL_BANDS]; ///< phase flags (phsflg)
|
int phase_flags[AC3_MAX_CPL_BANDS]; ///< phase flags (phsflg)
|
||||||
int num_cpl_bands; ///< number of coupling bands (ncplbnd)
|
int num_cpl_bands; ///< number of coupling bands (ncplbnd)
|
||||||
uint8_t cpl_band_struct[AC3_MAX_CPL_BANDS];
|
|
||||||
uint8_t cpl_band_sizes[AC3_MAX_CPL_BANDS]; ///< number of coeffs in each coupling band
|
uint8_t cpl_band_sizes[AC3_MAX_CPL_BANDS]; ///< number of coeffs in each coupling band
|
||||||
int firstchincpl; ///< first channel in coupling
|
int firstchincpl; ///< first channel in coupling
|
||||||
int first_cpl_coords[AC3_MAX_CHANNELS]; ///< first coupling coordinates states (firstcplcos)
|
int first_cpl_coords[AC3_MAX_CHANNELS]; ///< first coupling coordinates states (firstcplcos)
|
||||||
@@ -145,7 +144,6 @@ typedef struct AC3DecodeContext {
|
|||||||
int spx_dst_start_freq; ///< spx starting frequency bin for copying (copystartmant)
|
int spx_dst_start_freq; ///< spx starting frequency bin for copying (copystartmant)
|
||||||
///< the copy region ends at the start of the spx region.
|
///< the copy region ends at the start of the spx region.
|
||||||
int num_spx_bands; ///< number of spx bands (nspxbnds)
|
int num_spx_bands; ///< number of spx bands (nspxbnds)
|
||||||
uint8_t spx_band_struct[SPX_MAX_BANDS];
|
|
||||||
uint8_t spx_band_sizes[SPX_MAX_BANDS]; ///< number of bins in each spx band
|
uint8_t spx_band_sizes[SPX_MAX_BANDS]; ///< number of bins in each spx band
|
||||||
uint8_t first_spx_coords[AC3_MAX_CHANNELS]; ///< first spx coordinates states (firstspxcos)
|
uint8_t first_spx_coords[AC3_MAX_CHANNELS]; ///< first spx coordinates states (firstspxcos)
|
||||||
INTFLOAT spx_noise_blend[AC3_MAX_CHANNELS][SPX_MAX_BANDS]; ///< spx noise blending factor (nblendfact)
|
INTFLOAT spx_noise_blend[AC3_MAX_CHANNELS][SPX_MAX_BANDS]; ///< spx noise blending factor (nblendfact)
|
||||||
|
|||||||
+11
-12
@@ -64,12 +64,12 @@ static void scale_coefs (
|
|||||||
int dynrng,
|
int dynrng,
|
||||||
int len)
|
int len)
|
||||||
{
|
{
|
||||||
int i, shift;
|
int i, shift, round;
|
||||||
unsigned mul, round;
|
int16_t mul;
|
||||||
int temp, temp1, temp2, temp3, temp4, temp5, temp6, temp7;
|
int temp, temp1, temp2, temp3, temp4, temp5, temp6, temp7;
|
||||||
|
|
||||||
mul = (dynrng & 0x1f) + 0x20;
|
mul = (dynrng & 0x1f) + 0x20;
|
||||||
shift = 4 - (sign_extend(dynrng, 9) >> 5);
|
shift = 4 - ((dynrng << 23) >> 28);
|
||||||
if (shift > 0 ) {
|
if (shift > 0 ) {
|
||||||
round = 1 << (shift-1);
|
round = 1 << (shift-1);
|
||||||
for (i=0; i<len; i+=8) {
|
for (i=0; i<len; i+=8) {
|
||||||
@@ -107,30 +107,29 @@ static void scale_coefs (
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
shift = -shift;
|
shift = -shift;
|
||||||
mul <<= shift;
|
|
||||||
for (i=0; i<len; i+=8) {
|
for (i=0; i<len; i+=8) {
|
||||||
|
|
||||||
temp = src[i] * mul;
|
temp = src[i] * mul;
|
||||||
temp1 = src[i+1] * mul;
|
temp1 = src[i+1] * mul;
|
||||||
temp2 = src[i+2] * mul;
|
temp2 = src[i+2] * mul;
|
||||||
|
|
||||||
dst[i] = temp;
|
dst[i] = temp << shift;
|
||||||
temp3 = src[i+3] * mul;
|
temp3 = src[i+3] * mul;
|
||||||
|
|
||||||
dst[i+1] = temp1;
|
dst[i+1] = temp1 << shift;
|
||||||
temp4 = src[i + 4] * mul;
|
temp4 = src[i + 4] * mul;
|
||||||
dst[i+2] = temp2;
|
dst[i+2] = temp2 << shift;
|
||||||
|
|
||||||
temp5 = src[i+5] * mul;
|
temp5 = src[i+5] * mul;
|
||||||
dst[i+3] = temp3;
|
dst[i+3] = temp3 << shift;
|
||||||
temp6 = src[i+6] * mul;
|
temp6 = src[i+6] * mul;
|
||||||
|
|
||||||
dst[i+4] = temp4;
|
dst[i+4] = temp4 << shift;
|
||||||
temp7 = src[i+7] * mul;
|
temp7 = src[i+7] * mul;
|
||||||
|
|
||||||
dst[i+5] = temp5;
|
dst[i+5] = temp5 << shift;
|
||||||
dst[i+6] = temp6;
|
dst[i+6] = temp6 << shift;
|
||||||
dst[i+7] = temp7;
|
dst[i+7] = temp7 << shift;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-4
@@ -1065,7 +1065,7 @@ static int bit_alloc(AC3EncodeContext *s, int snr_offset)
|
|||||||
{
|
{
|
||||||
int blk, ch;
|
int blk, ch;
|
||||||
|
|
||||||
snr_offset = (snr_offset - 240) * 4;
|
snr_offset = (snr_offset - 240) << 2;
|
||||||
|
|
||||||
reset_block_bap(s);
|
reset_block_bap(s);
|
||||||
for (blk = 0; blk < s->num_blocks; blk++) {
|
for (blk = 0; blk < s->num_blocks; blk++) {
|
||||||
@@ -2051,8 +2051,7 @@ av_cold int ff_ac3_encode_close(AVCodecContext *avctx)
|
|||||||
av_freep(&block->cpl_coord_mant);
|
av_freep(&block->cpl_coord_mant);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->mdct_end)
|
s->mdct_end(s);
|
||||||
s->mdct_end(s);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -2434,7 +2433,7 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx)
|
|||||||
|
|
||||||
ret = validate_options(s);
|
ret = validate_options(s);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto init_fail;
|
return ret;
|
||||||
|
|
||||||
avctx->frame_size = AC3_BLOCK_SIZE * s->num_blocks;
|
avctx->frame_size = AC3_BLOCK_SIZE * s->num_blocks;
|
||||||
avctx->initial_padding = AC3_BLOCK_SIZE;
|
avctx->initial_padding = AC3_BLOCK_SIZE;
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ float ff_amr_set_fixed_gain(float fixed_gain_factor, float fixed_mean_energy,
|
|||||||
ff_exp10(0.05 *
|
ff_exp10(0.05 *
|
||||||
(avpriv_scalarproduct_float_c(pred_table, prediction_error, 4) +
|
(avpriv_scalarproduct_float_c(pred_table, prediction_error, 4) +
|
||||||
energy_mean)) /
|
energy_mean)) /
|
||||||
sqrtf(fixed_mean_energy ? fixed_mean_energy : 1.0);
|
sqrtf(fixed_mean_energy);
|
||||||
|
|
||||||
// update quantified prediction error energy history
|
// update quantified prediction error energy history
|
||||||
memmove(&prediction_error[0], &prediction_error[1],
|
memmove(&prediction_error[0], &prediction_error[1],
|
||||||
|
|||||||
+21
-36
@@ -110,10 +110,6 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx)
|
|||||||
case AV_CODEC_ID_ADPCM_MTAF:
|
case AV_CODEC_ID_ADPCM_MTAF:
|
||||||
min_channels = 2;
|
min_channels = 2;
|
||||||
max_channels = 8;
|
max_channels = 8;
|
||||||
if (avctx->channels & 1) {
|
|
||||||
avpriv_request_sample(avctx, "channel count %d\n", avctx->channels);
|
|
||||||
return AVERROR_PATCHWELCOME;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case AV_CODEC_ID_ADPCM_PSX:
|
case AV_CODEC_ID_ADPCM_PSX:
|
||||||
max_channels = 8;
|
max_channels = 8;
|
||||||
@@ -139,8 +135,8 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx)
|
|||||||
break;
|
break;
|
||||||
case AV_CODEC_ID_ADPCM_IMA_APC:
|
case AV_CODEC_ID_ADPCM_IMA_APC:
|
||||||
if (avctx->extradata && avctx->extradata_size >= 8) {
|
if (avctx->extradata && avctx->extradata_size >= 8) {
|
||||||
c->status[0].predictor = av_clip_intp2(AV_RL32(avctx->extradata ), 18);
|
c->status[0].predictor = AV_RL32(avctx->extradata);
|
||||||
c->status[1].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 4), 18);
|
c->status[1].predictor = AV_RL32(avctx->extradata + 4);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case AV_CODEC_ID_ADPCM_IMA_WS:
|
case AV_CODEC_ID_ADPCM_IMA_WS:
|
||||||
@@ -293,7 +289,7 @@ static inline int16_t adpcm_ima_oki_expand_nibble(ADPCMChannelStatus *c, int nib
|
|||||||
c->predictor = av_clip_intp2(predictor, 11);
|
c->predictor = av_clip_intp2(predictor, 11);
|
||||||
c->step_index = step_index;
|
c->step_index = step_index;
|
||||||
|
|
||||||
return c->predictor * 16;
|
return c->predictor << 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int16_t adpcm_ct_expand_nibble(ADPCMChannelStatus *c, int8_t nibble)
|
static inline int16_t adpcm_ct_expand_nibble(ADPCMChannelStatus *c, int8_t nibble)
|
||||||
@@ -382,10 +378,6 @@ static int xa_decode(AVCodecContext *avctx, int16_t *out0, int16_t *out1,
|
|||||||
avpriv_request_sample(avctx, "unknown XA-ADPCM filter %d", filter);
|
avpriv_request_sample(avctx, "unknown XA-ADPCM filter %d", filter);
|
||||||
filter=0;
|
filter=0;
|
||||||
}
|
}
|
||||||
if (shift < 0) {
|
|
||||||
avpriv_request_sample(avctx, "unknown XA-ADPCM shift %d", shift);
|
|
||||||
shift = 0;
|
|
||||||
}
|
|
||||||
f0 = xa_adpcm_table[filter][0];
|
f0 = xa_adpcm_table[filter][0];
|
||||||
f1 = xa_adpcm_table[filter][1];
|
f1 = xa_adpcm_table[filter][1];
|
||||||
|
|
||||||
@@ -396,7 +388,7 @@ static int xa_decode(AVCodecContext *avctx, int16_t *out0, int16_t *out1,
|
|||||||
d = in[16+i+j*4];
|
d = in[16+i+j*4];
|
||||||
|
|
||||||
t = sign_extend(d, 4);
|
t = sign_extend(d, 4);
|
||||||
s = t*(1<<shift) + ((s_1*f0 + s_2*f1+32)>>6);
|
s = ( t<<shift ) + ((s_1*f0 + s_2*f1+32)>>6);
|
||||||
s_2 = s_1;
|
s_2 = s_1;
|
||||||
s_1 = av_clip_int16(s);
|
s_1 = av_clip_int16(s);
|
||||||
out0[j] = s_1;
|
out0[j] = s_1;
|
||||||
@@ -411,14 +403,10 @@ static int xa_decode(AVCodecContext *avctx, int16_t *out0, int16_t *out1,
|
|||||||
|
|
||||||
shift = 12 - (in[5+i*2] & 15);
|
shift = 12 - (in[5+i*2] & 15);
|
||||||
filter = in[5+i*2] >> 4;
|
filter = in[5+i*2] >> 4;
|
||||||
if (filter >= FF_ARRAY_ELEMS(xa_adpcm_table) || shift < 0) {
|
if (filter >= FF_ARRAY_ELEMS(xa_adpcm_table)) {
|
||||||
avpriv_request_sample(avctx, "unknown XA-ADPCM filter %d", filter);
|
avpriv_request_sample(avctx, "unknown XA-ADPCM filter %d", filter);
|
||||||
filter=0;
|
filter=0;
|
||||||
}
|
}
|
||||||
if (shift < 0) {
|
|
||||||
avpriv_request_sample(avctx, "unknown XA-ADPCM shift %d", shift);
|
|
||||||
shift = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
f0 = xa_adpcm_table[filter][0];
|
f0 = xa_adpcm_table[filter][0];
|
||||||
f1 = xa_adpcm_table[filter][1];
|
f1 = xa_adpcm_table[filter][1];
|
||||||
@@ -427,7 +415,7 @@ static int xa_decode(AVCodecContext *avctx, int16_t *out0, int16_t *out1,
|
|||||||
d = in[16+i+j*4];
|
d = in[16+i+j*4];
|
||||||
|
|
||||||
t = sign_extend(d >> 4, 4);
|
t = sign_extend(d >> 4, 4);
|
||||||
s = t*(1<<shift) + ((s_1*f0 + s_2*f1+32)>>6);
|
s = ( t<<shift ) + ((s_1*f0 + s_2*f1+32)>>6);
|
||||||
s_2 = s_1;
|
s_2 = s_1;
|
||||||
s_1 = av_clip_int16(s);
|
s_1 = av_clip_int16(s);
|
||||||
out1[j] = s_1;
|
out1[j] = s_1;
|
||||||
@@ -1146,11 +1134,8 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (i=0; i<=st; i++) {
|
for (i=0; i<=st; i++)
|
||||||
c->status[i].predictor = bytestream2_get_le32u(&gb);
|
c->status[i].predictor = bytestream2_get_le32u(&gb);
|
||||||
if (FFABS((int64_t)c->status[i].predictor) > (1<<16))
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (n = nb_samples >> (1 - st); n > 0; n--) {
|
for (n = nb_samples >> (1 - st); n > 0; n--) {
|
||||||
int byte = bytestream2_get_byteu(&gb);
|
int byte = bytestream2_get_byteu(&gb);
|
||||||
@@ -1197,8 +1182,8 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
|
|
||||||
for (count2 = 0; count2 < 28; count2++) {
|
for (count2 = 0; count2 < 28; count2++) {
|
||||||
byte = bytestream2_get_byteu(&gb);
|
byte = bytestream2_get_byteu(&gb);
|
||||||
next_left_sample = sign_extend(byte >> 4, 4) * (1 << shift_left);
|
next_left_sample = sign_extend(byte >> 4, 4) << shift_left;
|
||||||
next_right_sample = sign_extend(byte, 4) * (1 << shift_right);
|
next_right_sample = sign_extend(byte, 4) << shift_right;
|
||||||
|
|
||||||
next_left_sample = (next_left_sample +
|
next_left_sample = (next_left_sample +
|
||||||
(current_left_sample * coeff1l) +
|
(current_left_sample * coeff1l) +
|
||||||
@@ -1237,7 +1222,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
if (st) byte[1] = bytestream2_get_byteu(&gb);
|
if (st) byte[1] = bytestream2_get_byteu(&gb);
|
||||||
for(i = 4; i >= 0; i-=4) { /* Pairwise samples LL RR (st) or LL LL (mono) */
|
for(i = 4; i >= 0; i-=4) { /* Pairwise samples LL RR (st) or LL LL (mono) */
|
||||||
for(channel = 0; channel < avctx->channels; channel++) {
|
for(channel = 0; channel < avctx->channels; channel++) {
|
||||||
int sample = sign_extend(byte[channel] >> i, 4) * (1 << shift[channel]);
|
int sample = sign_extend(byte[channel] >> i, 4) << shift[channel];
|
||||||
sample = (sample +
|
sample = (sample +
|
||||||
c->status[channel].sample1 * coeff[channel][0] +
|
c->status[channel].sample1 * coeff[channel][0] +
|
||||||
c->status[channel].sample2 * coeff[channel][1] + 0x80) >> 8;
|
c->status[channel].sample2 * coeff[channel][1] + 0x80) >> 8;
|
||||||
@@ -1298,10 +1283,10 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
|
|
||||||
for (count2=0; count2<28; count2++) {
|
for (count2=0; count2<28; count2++) {
|
||||||
if (count2 & 1)
|
if (count2 & 1)
|
||||||
next_sample = (unsigned)sign_extend(byte, 4) << shift;
|
next_sample = sign_extend(byte, 4) << shift;
|
||||||
else {
|
else {
|
||||||
byte = bytestream2_get_byte(&gb);
|
byte = bytestream2_get_byte(&gb);
|
||||||
next_sample = (unsigned)sign_extend(byte >> 4, 4) << shift;
|
next_sample = sign_extend(byte >> 4, 4) << shift;
|
||||||
}
|
}
|
||||||
|
|
||||||
next_sample += (current_sample * coeff1) +
|
next_sample += (current_sample * coeff1) +
|
||||||
@@ -1352,11 +1337,11 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
int level, pred;
|
int level, pred;
|
||||||
int byte = bytestream2_get_byteu(&gb);
|
int byte = bytestream2_get_byteu(&gb);
|
||||||
|
|
||||||
level = sign_extend(byte >> 4, 4) * (1 << shift[n]);
|
level = sign_extend(byte >> 4, 4) << shift[n];
|
||||||
pred = s[-1] * coeff[0][n] + s[-2] * coeff[1][n];
|
pred = s[-1] * coeff[0][n] + s[-2] * coeff[1][n];
|
||||||
s[0] = av_clip_int16((level + pred + 0x80) >> 8);
|
s[0] = av_clip_int16((level + pred + 0x80) >> 8);
|
||||||
|
|
||||||
level = sign_extend(byte, 4) * (1 << shift[n]);
|
level = sign_extend(byte, 4) << shift[n];
|
||||||
pred = s[0] * coeff[0][n] + s[-1] * coeff[1][n];
|
pred = s[0] * coeff[0][n] + s[-1] * coeff[1][n];
|
||||||
s[1] = av_clip_int16((level + pred + 0x80) >> 8);
|
s[1] = av_clip_int16((level + pred + 0x80) >> 8);
|
||||||
}
|
}
|
||||||
@@ -1513,8 +1498,8 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
sampledat = sign_extend(byte >> 4, 4);
|
sampledat = sign_extend(byte >> 4, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
sampledat = ((prev1 * factor1 + prev2 * factor2) >> 11) +
|
sampledat = ((prev1 * factor1 + prev2 * factor2) +
|
||||||
sampledat * scale;
|
((sampledat * scale) << 11)) >> 11;
|
||||||
*samples = av_clip_int16(sampledat);
|
*samples = av_clip_int16(sampledat);
|
||||||
prev2 = prev1;
|
prev2 = prev1;
|
||||||
prev1 = *samples++;
|
prev1 = *samples++;
|
||||||
@@ -1576,8 +1561,8 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
int byte = bytestream2_get_byteu(&gb);
|
int byte = bytestream2_get_byteu(&gb);
|
||||||
int index = (byte >> 4) & 7;
|
int index = (byte >> 4) & 7;
|
||||||
unsigned int exp = byte & 0x0F;
|
unsigned int exp = byte & 0x0F;
|
||||||
int64_t factor1 = table[ch][index * 2];
|
int factor1 = table[ch][index * 2];
|
||||||
int64_t factor2 = table[ch][index * 2 + 1];
|
int factor2 = table[ch][index * 2 + 1];
|
||||||
|
|
||||||
/* Decode 14 samples. */
|
/* Decode 14 samples. */
|
||||||
for (n = 0; n < 14 && (i * 14 + n < nb_samples); n++) {
|
for (n = 0; n < 14 && (i * 14 + n < nb_samples); n++) {
|
||||||
@@ -1591,7 +1576,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
sampledat = ((c->status[ch].sample1 * factor1
|
sampledat = ((c->status[ch].sample1 * factor1
|
||||||
+ c->status[ch].sample2 * factor2) >> 11) + sampledat * (1 << exp);
|
+ c->status[ch].sample2 * factor2) >> 11) + (sampledat << exp);
|
||||||
*samples = av_clip_int16(sampledat);
|
*samples = av_clip_int16(sampledat);
|
||||||
c->status[ch].sample2 = c->status[ch].sample1;
|
c->status[ch].sample2 = c->status[ch].sample1;
|
||||||
c->status[ch].sample1 = *samples++;
|
c->status[ch].sample1 = *samples++;
|
||||||
@@ -1638,7 +1623,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
else
|
else
|
||||||
sampledat = sign_extend(byte >> 4, 4);
|
sampledat = sign_extend(byte >> 4, 4);
|
||||||
|
|
||||||
sampledat = ((sampledat * (1 << 12)) >> (header & 0xf)) * (1 << 6) + prev;
|
sampledat = (((sampledat << 12) >> (header & 0xf)) << 6) + prev;
|
||||||
*samples++ = av_clip_int16(sampledat >> 6);
|
*samples++ = av_clip_int16(sampledat >> 6);
|
||||||
c->status[channel].sample2 = c->status[channel].sample1;
|
c->status[channel].sample2 = c->status[channel].sample1;
|
||||||
c->status[channel].sample1 = sampledat;
|
c->status[channel].sample1 = sampledat;
|
||||||
@@ -1675,7 +1660,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
scale = sign_extend(byte, 4);
|
scale = sign_extend(byte, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
scale = scale * (1 << 12);
|
scale = scale << 12;
|
||||||
sample = (int)((scale >> shift) + (c->status[channel].sample1 * xa_adpcm_table[filter][0] + c->status[channel].sample2 * xa_adpcm_table[filter][1]) / 64);
|
sample = (int)((scale >> shift) + (c->status[channel].sample1 * xa_adpcm_table[filter][0] + c->status[channel].sample2 * xa_adpcm_table[filter][1]) / 64);
|
||||||
}
|
}
|
||||||
*samples++ = av_clip_int16(sample);
|
*samples++ = av_clip_int16(sample);
|
||||||
|
|||||||
+1
-1
@@ -81,7 +81,7 @@ static int adx_decode(ADXContext *c, int16_t *out, int offset,
|
|||||||
s2 = prev->s2;
|
s2 = prev->s2;
|
||||||
for (i = 0; i < BLOCK_SAMPLES; i++) {
|
for (i = 0; i < BLOCK_SAMPLES; i++) {
|
||||||
d = get_sbits(&gb, 4);
|
d = get_sbits(&gb, 4);
|
||||||
s0 = ((d * (1 << COEFF_BITS)) * scale + c->coeff[0] * s1 + c->coeff[1] * s2) >> COEFF_BITS;
|
s0 = ((d << COEFF_BITS) * scale + c->coeff[0] * s1 + c->coeff[1] * s2) >> COEFF_BITS;
|
||||||
s2 = s1;
|
s2 = s1;
|
||||||
s1 = av_clip_int16(s0);
|
s1 = av_clip_int16(s0);
|
||||||
*out++ = s1;
|
*out++ = s1;
|
||||||
|
|||||||
+3
-3
@@ -48,7 +48,7 @@ static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav,
|
|||||||
s2 = prev->s2;
|
s2 = prev->s2;
|
||||||
for (i = 0, j = 0; j < 32; i += channels, j++) {
|
for (i = 0, j = 0; j < 32; i += channels, j++) {
|
||||||
s0 = wav[i];
|
s0 = wav[i];
|
||||||
d = s0 + ((-c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS);
|
d = ((s0 << COEFF_BITS) - c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS;
|
||||||
if (max < d)
|
if (max < d)
|
||||||
max = d;
|
max = d;
|
||||||
if (min > d)
|
if (min > d)
|
||||||
@@ -79,13 +79,13 @@ static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav,
|
|||||||
s1 = prev->s1;
|
s1 = prev->s1;
|
||||||
s2 = prev->s2;
|
s2 = prev->s2;
|
||||||
for (i = 0, j = 0; j < 32; i += channels, j++) {
|
for (i = 0, j = 0; j < 32; i += channels, j++) {
|
||||||
d = wav[i] + ((-c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS);
|
d = ((wav[i] << COEFF_BITS) - c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS;
|
||||||
|
|
||||||
d = av_clip_intp2(ROUNDED_DIV(d, scale), 3);
|
d = av_clip_intp2(ROUNDED_DIV(d, scale), 3);
|
||||||
|
|
||||||
put_sbits(&pb, 4, d);
|
put_sbits(&pb, 4, d);
|
||||||
|
|
||||||
s0 = d * scale + ((c->coeff[0] * s1 + c->coeff[1] * s2) >> COEFF_BITS);
|
s0 = ((d << COEFF_BITS) * scale + c->coeff[0] * s1 + c->coeff[1] * s2) >> COEFF_BITS;
|
||||||
s2 = s1;
|
s2 = s1;
|
||||||
s1 = s0;
|
s1 = s0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -208,9 +208,6 @@ static int aic_decode_coeffs(GetBitContext *gb, int16_t *dst,
|
|||||||
int mb, idx;
|
int mb, idx;
|
||||||
unsigned val;
|
unsigned val;
|
||||||
|
|
||||||
if (get_bits_left(gb) < 5)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
has_skips = get_bits1(gb);
|
has_skips = get_bits1(gb);
|
||||||
coeff_type = get_bits1(gb);
|
coeff_type = get_bits1(gb);
|
||||||
coeff_bits = get_bits(gb, 3);
|
coeff_bits = get_bits(gb, 3);
|
||||||
|
|||||||
+10
-13
@@ -170,12 +170,12 @@ static inline int sign_only(int v)
|
|||||||
return v ? FFSIGN(v) : 0;
|
return v ? FFSIGN(v) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lpc_prediction(int32_t *error_buffer, uint32_t *buffer_out,
|
static void lpc_prediction(int32_t *error_buffer, int32_t *buffer_out,
|
||||||
int nb_samples, int bps, int16_t *lpc_coefs,
|
int nb_samples, int bps, int16_t *lpc_coefs,
|
||||||
int lpc_order, int lpc_quant)
|
int lpc_order, int lpc_quant)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
uint32_t *pred = buffer_out;
|
int32_t *pred = buffer_out;
|
||||||
|
|
||||||
/* first sample always copies */
|
/* first sample always copies */
|
||||||
*buffer_out = *error_buffer;
|
*buffer_out = *error_buffer;
|
||||||
@@ -207,27 +207,27 @@ static void lpc_prediction(int32_t *error_buffer, uint32_t *buffer_out,
|
|||||||
for (; i < nb_samples; i++) {
|
for (; i < nb_samples; i++) {
|
||||||
int j;
|
int j;
|
||||||
int val = 0;
|
int val = 0;
|
||||||
unsigned error_val = error_buffer[i];
|
int error_val = error_buffer[i];
|
||||||
int error_sign;
|
int error_sign;
|
||||||
int d = *pred++;
|
int d = *pred++;
|
||||||
|
|
||||||
/* LPC prediction */
|
/* LPC prediction */
|
||||||
for (j = 0; j < lpc_order; j++)
|
for (j = 0; j < lpc_order; j++)
|
||||||
val += (pred[j] - d) * lpc_coefs[j];
|
val += (pred[j] - d) * lpc_coefs[j];
|
||||||
val = (val + (1LL << (lpc_quant - 1))) >> lpc_quant;
|
val = (val + (1 << (lpc_quant - 1))) >> lpc_quant;
|
||||||
val += d + error_val;
|
val += d + error_val;
|
||||||
buffer_out[i] = sign_extend(val, bps);
|
buffer_out[i] = sign_extend(val, bps);
|
||||||
|
|
||||||
/* adapt LPC coefficients */
|
/* adapt LPC coefficients */
|
||||||
error_sign = sign_only(error_val);
|
error_sign = sign_only(error_val);
|
||||||
if (error_sign) {
|
if (error_sign) {
|
||||||
for (j = 0; j < lpc_order && (int)(error_val * error_sign) > 0; j++) {
|
for (j = 0; j < lpc_order && error_val * error_sign > 0; j++) {
|
||||||
int sign;
|
int sign;
|
||||||
val = d - pred[j];
|
val = d - pred[j];
|
||||||
sign = sign_only(val) * error_sign;
|
sign = sign_only(val) * error_sign;
|
||||||
lpc_coefs[j] -= sign;
|
lpc_coefs[j] -= sign;
|
||||||
val *= (unsigned)sign;
|
val *= sign;
|
||||||
error_val -= (val >> lpc_quant) * (j + 1U);
|
error_val -= (val >> lpc_quant) * (j + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -299,16 +299,13 @@ static int decode_element(AVCodecContext *avctx, AVFrame *frame, int ch_index,
|
|||||||
decorr_shift = get_bits(&alac->gb, 8);
|
decorr_shift = get_bits(&alac->gb, 8);
|
||||||
decorr_left_weight = get_bits(&alac->gb, 8);
|
decorr_left_weight = get_bits(&alac->gb, 8);
|
||||||
|
|
||||||
if (channels == 2 && decorr_left_weight && decorr_shift > 31)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
for (ch = 0; ch < channels; ch++) {
|
for (ch = 0; ch < channels; ch++) {
|
||||||
prediction_type[ch] = get_bits(&alac->gb, 4);
|
prediction_type[ch] = get_bits(&alac->gb, 4);
|
||||||
lpc_quant[ch] = get_bits(&alac->gb, 4);
|
lpc_quant[ch] = get_bits(&alac->gb, 4);
|
||||||
rice_history_mult[ch] = get_bits(&alac->gb, 3);
|
rice_history_mult[ch] = get_bits(&alac->gb, 3);
|
||||||
lpc_order[ch] = get_bits(&alac->gb, 5);
|
lpc_order[ch] = get_bits(&alac->gb, 5);
|
||||||
|
|
||||||
if (lpc_order[ch] >= alac->max_samples_per_frame || !lpc_quant[ch])
|
if (lpc_order[ch] >= alac->max_samples_per_frame)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
|
|
||||||
/* read the predictor table */
|
/* read the predictor table */
|
||||||
@@ -397,13 +394,13 @@ static int decode_element(AVCodecContext *avctx, AVFrame *frame, int ch_index,
|
|||||||
case 20: {
|
case 20: {
|
||||||
for (ch = 0; ch < channels; ch++) {
|
for (ch = 0; ch < channels; ch++) {
|
||||||
for (i = 0; i < alac->nb_samples; i++)
|
for (i = 0; i < alac->nb_samples; i++)
|
||||||
alac->output_samples_buffer[ch][i] *= 1U << 12;
|
alac->output_samples_buffer[ch][i] <<= 12;
|
||||||
}}
|
}}
|
||||||
break;
|
break;
|
||||||
case 24: {
|
case 24: {
|
||||||
for (ch = 0; ch < channels; ch++) {
|
for (ch = 0; ch < channels; ch++) {
|
||||||
for (i = 0; i < alac->nb_samples; i++)
|
for (i = 0; i < alac->nb_samples; i++)
|
||||||
alac->output_samples_buffer[ch][i] *= 1U << 8;
|
alac->output_samples_buffer[ch][i] <<= 8;
|
||||||
}}
|
}}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,12 +29,12 @@ static void decorrelate_stereo(int32_t *buffer[2], int nb_samples,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < nb_samples; i++) {
|
for (i = 0; i < nb_samples; i++) {
|
||||||
uint32_t a, b;
|
int32_t a, b;
|
||||||
|
|
||||||
a = buffer[0][i];
|
a = buffer[0][i];
|
||||||
b = buffer[1][i];
|
b = buffer[1][i];
|
||||||
|
|
||||||
a -= (int)(b * decorr_left_weight) >> decorr_shift;
|
a -= (b * decorr_left_weight) >> decorr_shift;
|
||||||
b += a;
|
b += a;
|
||||||
|
|
||||||
buffer[0][i] = b;
|
buffer[0][i] = b;
|
||||||
@@ -49,7 +49,7 @@ static void append_extra_bits(int32_t *buffer[2], int32_t *extra_bits_buffer[2],
|
|||||||
|
|
||||||
for (ch = 0; ch < channels; ch++)
|
for (ch = 0; ch < channels; ch++)
|
||||||
for (i = 0; i < nb_samples; i++)
|
for (i = 0; i < nb_samples; i++)
|
||||||
buffer[ch][i] = ((unsigned)buffer[ch][i] << extra_bits) | extra_bits_buffer[ch][i];
|
buffer[ch][i] = (buffer[ch][i] << extra_bits) | extra_bits_buffer[ch][i];
|
||||||
}
|
}
|
||||||
|
|
||||||
av_cold void ff_alacdsp_init(ALACDSPContext *c)
|
av_cold void ff_alacdsp_init(ALACDSPContext *c)
|
||||||
|
|||||||
@@ -62,9 +62,6 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (bytestream2_get_bytes_left(&gb) < width*height / 255)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
ret = ff_get_buffer(avctx, f, 0);
|
ret = ff_get_buffer(avctx, f, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
+24
-58
@@ -349,11 +349,6 @@ static av_cold int read_specific_config(ALSDecContext *ctx)
|
|||||||
if (als_id != MKBETAG('A','L','S','\0'))
|
if (als_id != MKBETAG('A','L','S','\0'))
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
|
|
||||||
if (avctx->channels > FF_SANE_NB_CHANNELS) {
|
|
||||||
avpriv_request_sample(avctx, "Huge number of channels\n");
|
|
||||||
return AVERROR_PATCHWELCOME;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->cur_frame_length = sconf->frame_length;
|
ctx->cur_frame_length = sconf->frame_length;
|
||||||
|
|
||||||
// read channel config
|
// read channel config
|
||||||
@@ -493,7 +488,7 @@ static void parse_bs_info(const uint32_t bs_info, unsigned int n,
|
|||||||
static int32_t decode_rice(GetBitContext *gb, unsigned int k)
|
static int32_t decode_rice(GetBitContext *gb, unsigned int k)
|
||||||
{
|
{
|
||||||
int max = get_bits_left(gb) - k;
|
int max = get_bits_left(gb) - k;
|
||||||
unsigned q = get_unary(gb, 0, max);
|
int q = get_unary(gb, 0, max);
|
||||||
int r = k ? get_bits1(gb) : !(q & 1);
|
int r = k ? get_bits1(gb) : !(q & 1);
|
||||||
|
|
||||||
if (k > 1) {
|
if (k > 1) {
|
||||||
@@ -513,7 +508,7 @@ static void parcor_to_lpc(unsigned int k, const int32_t *par, int32_t *cof)
|
|||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
for (i = 0, j = k - 1; i < j; i++, j--) {
|
for (i = 0, j = k - 1; i < j; i++, j--) {
|
||||||
unsigned tmp1 = ((MUL64(par[k], cof[j]) + (1 << 19)) >> 20);
|
int tmp1 = ((MUL64(par[k], cof[j]) + (1 << 19)) >> 20);
|
||||||
cof[j] += ((MUL64(par[k], cof[i]) + (1 << 19)) >> 20);
|
cof[j] += ((MUL64(par[k], cof[i]) + (1 << 19)) >> 20);
|
||||||
cof[i] += tmp1;
|
cof[i] += tmp1;
|
||||||
}
|
}
|
||||||
@@ -663,7 +658,7 @@ static int read_var_block_data(ALSDecContext *ctx, ALSBlockData *bd)
|
|||||||
|
|
||||||
// do not continue in case of a damaged stream since
|
// do not continue in case of a damaged stream since
|
||||||
// block_length must be evenly divisible by sub_blocks
|
// block_length must be evenly divisible by sub_blocks
|
||||||
if (bd->block_length & (sub_blocks - 1) || bd->block_length <= 0) {
|
if (bd->block_length & (sub_blocks - 1)) {
|
||||||
av_log(avctx, AV_LOG_WARNING,
|
av_log(avctx, AV_LOG_WARNING,
|
||||||
"Block length is not evenly divisible by the number of subblocks.\n");
|
"Block length is not evenly divisible by the number of subblocks.\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
@@ -778,8 +773,8 @@ static int read_var_block_data(ALSDecContext *ctx, ALSBlockData *bd)
|
|||||||
if (*bd->use_ltp) {
|
if (*bd->use_ltp) {
|
||||||
int r, c;
|
int r, c;
|
||||||
|
|
||||||
bd->ltp_gain[0] = decode_rice(gb, 1) * 8;
|
bd->ltp_gain[0] = decode_rice(gb, 1) << 3;
|
||||||
bd->ltp_gain[1] = decode_rice(gb, 2) * 8;
|
bd->ltp_gain[1] = decode_rice(gb, 2) << 3;
|
||||||
|
|
||||||
r = get_unary(gb, 0, 4);
|
r = get_unary(gb, 0, 4);
|
||||||
c = get_bits(gb, 2);
|
c = get_bits(gb, 2);
|
||||||
@@ -790,8 +785,8 @@ static int read_var_block_data(ALSDecContext *ctx, ALSBlockData *bd)
|
|||||||
|
|
||||||
bd->ltp_gain[2] = ltp_gain_values[r][c];
|
bd->ltp_gain[2] = ltp_gain_values[r][c];
|
||||||
|
|
||||||
bd->ltp_gain[3] = decode_rice(gb, 2) * 8;
|
bd->ltp_gain[3] = decode_rice(gb, 2) << 3;
|
||||||
bd->ltp_gain[4] = decode_rice(gb, 1) * 8;
|
bd->ltp_gain[4] = decode_rice(gb, 1) << 3;
|
||||||
|
|
||||||
*bd->ltp_lag = get_bits(gb, ctx->ltp_lag_length);
|
*bd->ltp_lag = get_bits(gb, ctx->ltp_lag_length);
|
||||||
*bd->ltp_lag += FFMAX(4, opt_order + 1);
|
*bd->ltp_lag += FFMAX(4, opt_order + 1);
|
||||||
@@ -800,20 +795,14 @@ static int read_var_block_data(ALSDecContext *ctx, ALSBlockData *bd)
|
|||||||
|
|
||||||
// read first value and residuals in case of a random access block
|
// read first value and residuals in case of a random access block
|
||||||
if (bd->ra_block) {
|
if (bd->ra_block) {
|
||||||
start = FFMIN(opt_order, 3);
|
|
||||||
av_assert0(sb_length <= sconf->frame_length);
|
|
||||||
if (sb_length <= start) {
|
|
||||||
// opt_order or sb_length may be corrupted, either way this is unsupported and not well defined in the specification
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "Sub block length smaller or equal start\n");
|
|
||||||
return AVERROR_PATCHWELCOME;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (opt_order)
|
if (opt_order)
|
||||||
bd->raw_samples[0] = decode_rice(gb, avctx->bits_per_raw_sample - 4);
|
bd->raw_samples[0] = decode_rice(gb, avctx->bits_per_raw_sample - 4);
|
||||||
if (opt_order > 1)
|
if (opt_order > 1)
|
||||||
bd->raw_samples[1] = decode_rice(gb, FFMIN(s[0] + 3, ctx->s_max));
|
bd->raw_samples[1] = decode_rice(gb, FFMIN(s[0] + 3, ctx->s_max));
|
||||||
if (opt_order > 2)
|
if (opt_order > 2)
|
||||||
bd->raw_samples[2] = decode_rice(gb, FFMIN(s[0] + 1, ctx->s_max));
|
bd->raw_samples[2] = decode_rice(gb, FFMIN(s[0] + 1, ctx->s_max));
|
||||||
|
|
||||||
|
start = FFMIN(opt_order, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
// read all residuals
|
// read all residuals
|
||||||
@@ -827,9 +816,7 @@ static int read_var_block_data(ALSDecContext *ctx, ALSBlockData *bd)
|
|||||||
unsigned int low;
|
unsigned int low;
|
||||||
unsigned int value;
|
unsigned int value;
|
||||||
|
|
||||||
int ret = ff_bgmc_decode_init(gb, &high, &low, &value);
|
ff_bgmc_decode_init(gb, &high, &low, &value);
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
current_res = bd->raw_samples + start;
|
current_res = bd->raw_samples + start;
|
||||||
|
|
||||||
@@ -839,9 +826,6 @@ static int read_var_block_data(ALSDecContext *ctx, ALSBlockData *bd)
|
|||||||
k [sb] = s[sb] > b ? s[sb] - b : 0;
|
k [sb] = s[sb] > b ? s[sb] - b : 0;
|
||||||
delta[sb] = 5 - s[sb] + k[sb];
|
delta[sb] = 5 - s[sb] + k[sb];
|
||||||
|
|
||||||
if (k[sb] >= 32)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
ff_bgmc_decode(gb, sb_len, current_res,
|
ff_bgmc_decode(gb, sb_len, current_res,
|
||||||
delta[sb], sx[sb], &high, &low, &value, ctx->bgmc_lut, ctx->bgmc_lut_status);
|
delta[sb], sx[sb], &high, &low, &value, ctx->bgmc_lut, ctx->bgmc_lut_status);
|
||||||
|
|
||||||
@@ -934,7 +918,7 @@ static int decode_var_block_data(ALSDecContext *ctx, ALSBlockData *bd)
|
|||||||
y = 1 << 6;
|
y = 1 << 6;
|
||||||
|
|
||||||
for (base = begin; base < end; base++, tab++)
|
for (base = begin; base < end; base++, tab++)
|
||||||
y += (uint64_t)MUL64(bd->ltp_gain[tab], raw_samples[base]);
|
y += MUL64(bd->ltp_gain[tab], raw_samples[base]);
|
||||||
|
|
||||||
raw_samples[ltp_smp] += y >> 7;
|
raw_samples[ltp_smp] += y >> 7;
|
||||||
}
|
}
|
||||||
@@ -946,7 +930,7 @@ static int decode_var_block_data(ALSDecContext *ctx, ALSBlockData *bd)
|
|||||||
y = 1 << 19;
|
y = 1 << 19;
|
||||||
|
|
||||||
for (sb = 0; sb < smp; sb++)
|
for (sb = 0; sb < smp; sb++)
|
||||||
y += (uint64_t)MUL64(lpc_cof[sb], raw_samples[-(sb + 1)]);
|
y += MUL64(lpc_cof[sb], raw_samples[-(sb + 1)]);
|
||||||
|
|
||||||
*raw_samples++ -= y >> 20;
|
*raw_samples++ -= y >> 20;
|
||||||
parcor_to_lpc(smp, quant_cof, lpc_cof);
|
parcor_to_lpc(smp, quant_cof, lpc_cof);
|
||||||
@@ -962,7 +946,7 @@ static int decode_var_block_data(ALSDecContext *ctx, ALSBlockData *bd)
|
|||||||
|
|
||||||
// reconstruct difference signal for prediction (joint-stereo)
|
// reconstruct difference signal for prediction (joint-stereo)
|
||||||
if (bd->js_blocks && bd->raw_other) {
|
if (bd->js_blocks && bd->raw_other) {
|
||||||
uint32_t *left, *right;
|
int32_t *left, *right;
|
||||||
|
|
||||||
if (bd->raw_other > raw_samples) { // D = R - L
|
if (bd->raw_other > raw_samples) { // D = R - L
|
||||||
left = raw_samples;
|
left = raw_samples;
|
||||||
@@ -996,7 +980,7 @@ static int decode_var_block_data(ALSDecContext *ctx, ALSBlockData *bd)
|
|||||||
y = 1 << 19;
|
y = 1 << 19;
|
||||||
|
|
||||||
for (sb = -opt_order; sb < 0; sb++)
|
for (sb = -opt_order; sb < 0; sb++)
|
||||||
y += (uint64_t)MUL64(lpc_cof[sb], raw_samples[sb]);
|
y += MUL64(lpc_cof[sb], raw_samples[sb]);
|
||||||
|
|
||||||
*raw_samples -= y >> 20;
|
*raw_samples -= y >> 20;
|
||||||
}
|
}
|
||||||
@@ -1021,10 +1005,6 @@ static int read_block(ALSDecContext *ctx, ALSBlockData *bd)
|
|||||||
ALSSpecificConfig *sconf = &ctx->sconf;
|
ALSSpecificConfig *sconf = &ctx->sconf;
|
||||||
|
|
||||||
*bd->shift_lsbs = 0;
|
*bd->shift_lsbs = 0;
|
||||||
|
|
||||||
if (get_bits_left(gb) < 1)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
// read block type flag and read the samples accordingly
|
// read block type flag and read the samples accordingly
|
||||||
if (get_bits1(gb)) {
|
if (get_bits1(gb)) {
|
||||||
ret = read_var_block_data(ctx, bd);
|
ret = read_var_block_data(ctx, bd);
|
||||||
@@ -1059,7 +1039,7 @@ static int decode_block(ALSDecContext *ctx, ALSBlockData *bd)
|
|||||||
|
|
||||||
if (*bd->shift_lsbs)
|
if (*bd->shift_lsbs)
|
||||||
for (smp = 0; smp < bd->block_length; smp++)
|
for (smp = 0; smp < bd->block_length; smp++)
|
||||||
bd->raw_samples[smp] = (unsigned)bd->raw_samples[smp] << *bd->shift_lsbs;
|
bd->raw_samples[smp] <<= *bd->shift_lsbs;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1195,10 +1175,10 @@ static int decode_blocks(ALSDecContext *ctx, unsigned int ra_frame,
|
|||||||
av_log(ctx->avctx, AV_LOG_WARNING, "Invalid channel pair.\n");
|
av_log(ctx->avctx, AV_LOG_WARNING, "Invalid channel pair.\n");
|
||||||
|
|
||||||
for (s = 0; s < div_blocks[b]; s++)
|
for (s = 0; s < div_blocks[b]; s++)
|
||||||
bd[0].raw_samples[s] = bd[1].raw_samples[s] - (unsigned)bd[0].raw_samples[s];
|
bd[0].raw_samples[s] = bd[1].raw_samples[s] - bd[0].raw_samples[s];
|
||||||
} else if (bd[1].js_blocks) {
|
} else if (bd[1].js_blocks) {
|
||||||
for (s = 0; s < div_blocks[b]; s++)
|
for (s = 0; s < div_blocks[b]; s++)
|
||||||
bd[1].raw_samples[s] = bd[1].raw_samples[s] + (unsigned)bd[0].raw_samples[s];
|
bd[1].raw_samples[s] = bd[1].raw_samples[s] + bd[0].raw_samples[s];
|
||||||
}
|
}
|
||||||
|
|
||||||
offset += div_blocks[b];
|
offset += div_blocks[b];
|
||||||
@@ -1405,9 +1385,6 @@ static SoftFloat_IEEE754 multiply(SoftFloat_IEEE754 a, SoftFloat_IEEE754 b) {
|
|||||||
mantissa_temp = (uint64_t)a.mant * (uint64_t)b.mant;
|
mantissa_temp = (uint64_t)a.mant * (uint64_t)b.mant;
|
||||||
mask_64 = (uint64_t)0x1 << 47;
|
mask_64 = (uint64_t)0x1 << 47;
|
||||||
|
|
||||||
if (!mantissa_temp)
|
|
||||||
return FLOAT_0;
|
|
||||||
|
|
||||||
// Count the valid bit count
|
// Count the valid bit count
|
||||||
while (!(mantissa_temp & mask_64) && mask_64) {
|
while (!(mantissa_temp & mask_64) && mask_64) {
|
||||||
bit_count--;
|
bit_count--;
|
||||||
@@ -1424,11 +1401,7 @@ static SoftFloat_IEEE754 multiply(SoftFloat_IEEE754 a, SoftFloat_IEEE754 b) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cutoff_bit_count >= 0) {
|
mantissa = (unsigned int)(mantissa_temp >> cutoff_bit_count);
|
||||||
mantissa = (unsigned int)(mantissa_temp >> cutoff_bit_count);
|
|
||||||
} else {
|
|
||||||
mantissa = (unsigned int)(mantissa_temp <<-cutoff_bit_count);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Need one more shift?
|
// Need one more shift?
|
||||||
if (mantissa & 0x01000000ul) {
|
if (mantissa & 0x01000000ul) {
|
||||||
@@ -1440,7 +1413,7 @@ static SoftFloat_IEEE754 multiply(SoftFloat_IEEE754 a, SoftFloat_IEEE754 b) {
|
|||||||
return_val = 0x80000000U;
|
return_val = 0x80000000U;
|
||||||
}
|
}
|
||||||
|
|
||||||
return_val |= ((unsigned)av_clip(a.exp + b.exp + bit_count - 47, -126, 127) << 23) & 0x7F800000;
|
return_val |= (a.exp + b.exp + bit_count - 47) << 23;
|
||||||
return_val |= mantissa;
|
return_val |= mantissa;
|
||||||
return av_bits2sf_ieee754(return_val);
|
return av_bits2sf_ieee754(return_val);
|
||||||
}
|
}
|
||||||
@@ -1485,9 +1458,6 @@ static int read_diff_float_data(ALSDecContext *ctx, unsigned int ra_frame) {
|
|||||||
ff_mlz_flush_dict(ctx->mlz);
|
ff_mlz_flush_dict(ctx->mlz);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (avctx->channels * 8 > get_bits_left(gb))
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
for (c = 0; c < avctx->channels; ++c) {
|
for (c = 0; c < avctx->channels; ++c) {
|
||||||
if (use_acf) {
|
if (use_acf) {
|
||||||
//acf_flag
|
//acf_flag
|
||||||
@@ -1828,17 +1798,15 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr,
|
|||||||
#define INTERLEAVE_OUTPUT(bps) \
|
#define INTERLEAVE_OUTPUT(bps) \
|
||||||
{ \
|
{ \
|
||||||
int##bps##_t *dest = (int##bps##_t*)frame->data[0]; \
|
int##bps##_t *dest = (int##bps##_t*)frame->data[0]; \
|
||||||
int channels = avctx->channels; \
|
|
||||||
int32_t **raw_samples = ctx->raw_samples; \
|
|
||||||
shift = bps - ctx->avctx->bits_per_raw_sample; \
|
shift = bps - ctx->avctx->bits_per_raw_sample; \
|
||||||
if (!ctx->cs_switch) { \
|
if (!ctx->cs_switch) { \
|
||||||
for (sample = 0; sample < ctx->cur_frame_length; sample++) \
|
for (sample = 0; sample < ctx->cur_frame_length; sample++) \
|
||||||
for (c = 0; c < channels; c++) \
|
for (c = 0; c < avctx->channels; c++) \
|
||||||
*dest++ = raw_samples[c][sample] * (1U << shift); \
|
*dest++ = ctx->raw_samples[c][sample] << shift; \
|
||||||
} else { \
|
} else { \
|
||||||
for (sample = 0; sample < ctx->cur_frame_length; sample++) \
|
for (sample = 0; sample < ctx->cur_frame_length; sample++) \
|
||||||
for (c = 0; c < channels; c++) \
|
for (c = 0; c < avctx->channels; c++) \
|
||||||
*dest++ = raw_samples[sconf->chan_pos[c]][sample] * (1U << shift);\
|
*dest++ = ctx->raw_samples[sconf->chan_pos[c]][sample] << shift; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2022,8 +1990,6 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
|||||||
|
|
||||||
// allocate quantized parcor coefficient buffer
|
// allocate quantized parcor coefficient buffer
|
||||||
num_buffers = sconf->mc_coding ? avctx->channels : 1;
|
num_buffers = sconf->mc_coding ? avctx->channels : 1;
|
||||||
if (num_buffers * (uint64_t)num_buffers > INT_MAX) // protect chan_data_buffer allocation
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
ctx->quant_cof = av_malloc_array(num_buffers, sizeof(*ctx->quant_cof));
|
ctx->quant_cof = av_malloc_array(num_buffers, sizeof(*ctx->quant_cof));
|
||||||
ctx->lpc_cof = av_malloc_array(num_buffers, sizeof(*ctx->lpc_cof));
|
ctx->lpc_cof = av_malloc_array(num_buffers, sizeof(*ctx->lpc_cof));
|
||||||
@@ -2156,6 +2122,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
decode_end(avctx);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2181,5 +2148,4 @@ AVCodec ff_als_decoder = {
|
|||||||
.decode = decode_frame,
|
.decode = decode_frame,
|
||||||
.flush = flush,
|
.flush = flush,
|
||||||
.capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1,
|
.capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1,
|
||||||
.caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
|
|
||||||
};
|
};
|
||||||
|
|||||||
+7
-12
@@ -262,7 +262,7 @@ static void decode_pitch_lag_high(int *lag_int, int *lag_frac, int pitch_index,
|
|||||||
*lag_frac = pitch_index - (*lag_int << 2) + 136;
|
*lag_frac = pitch_index - (*lag_int << 2) + 136;
|
||||||
} else if (pitch_index < 440) {
|
} else if (pitch_index < 440) {
|
||||||
*lag_int = (pitch_index + 257 - 376) >> 1;
|
*lag_int = (pitch_index + 257 - 376) >> 1;
|
||||||
*lag_frac = (pitch_index - (*lag_int << 1) + 256 - 376) * 2;
|
*lag_frac = (pitch_index - (*lag_int << 1) + 256 - 376) << 1;
|
||||||
/* the actual resolution is 1/2 but expressed as 1/4 */
|
/* the actual resolution is 1/2 but expressed as 1/4 */
|
||||||
} else {
|
} else {
|
||||||
*lag_int = pitch_index - 280;
|
*lag_int = pitch_index - 280;
|
||||||
@@ -292,7 +292,7 @@ static void decode_pitch_lag_low(int *lag_int, int *lag_frac, int pitch_index,
|
|||||||
if (subframe == 0 || (subframe == 2 && mode != MODE_6k60)) {
|
if (subframe == 0 || (subframe == 2 && mode != MODE_6k60)) {
|
||||||
if (pitch_index < 116) {
|
if (pitch_index < 116) {
|
||||||
*lag_int = (pitch_index + 69) >> 1;
|
*lag_int = (pitch_index + 69) >> 1;
|
||||||
*lag_frac = (pitch_index - (*lag_int << 1) + 68) * 2;
|
*lag_frac = (pitch_index - (*lag_int << 1) + 68) << 1;
|
||||||
} else {
|
} else {
|
||||||
*lag_int = pitch_index - 24;
|
*lag_int = pitch_index - 24;
|
||||||
*lag_frac = 0;
|
*lag_frac = 0;
|
||||||
@@ -302,7 +302,7 @@ static void decode_pitch_lag_low(int *lag_int, int *lag_frac, int pitch_index,
|
|||||||
AMRWB_P_DELAY_MIN, AMRWB_P_DELAY_MAX - 15);
|
AMRWB_P_DELAY_MIN, AMRWB_P_DELAY_MAX - 15);
|
||||||
} else {
|
} else {
|
||||||
*lag_int = (pitch_index + 1) >> 1;
|
*lag_int = (pitch_index + 1) >> 1;
|
||||||
*lag_frac = (pitch_index - (*lag_int << 1)) * 2;
|
*lag_frac = (pitch_index - (*lag_int << 1)) << 1;
|
||||||
*lag_int += *base_lag_int;
|
*lag_int += *base_lag_int;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -611,7 +611,7 @@ static float voice_factor(float *p_vector, float p_gain,
|
|||||||
AMRWB_SFR_SIZE) *
|
AMRWB_SFR_SIZE) *
|
||||||
f_gain * f_gain;
|
f_gain * f_gain;
|
||||||
|
|
||||||
return (p_ener - f_ener) / (p_ener + f_ener + 0.01);
|
return (p_ener - f_ener) / (p_ener + f_ener);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -862,20 +862,15 @@ static float find_hb_gain(AMRWBContext *ctx, const float *synth,
|
|||||||
{
|
{
|
||||||
int wsp = (vad > 0);
|
int wsp = (vad > 0);
|
||||||
float tilt;
|
float tilt;
|
||||||
float tmp;
|
|
||||||
|
|
||||||
if (ctx->fr_cur_mode == MODE_23k85)
|
if (ctx->fr_cur_mode == MODE_23k85)
|
||||||
return qua_hb_gain[hb_idx] * (1.0f / (1 << 14));
|
return qua_hb_gain[hb_idx] * (1.0f / (1 << 14));
|
||||||
|
|
||||||
tmp = ctx->celpm_ctx.dot_productf(synth, synth + 1, AMRWB_SFR_SIZE - 1);
|
tilt = ctx->celpm_ctx.dot_productf(synth, synth + 1, AMRWB_SFR_SIZE - 1) /
|
||||||
|
ctx->celpm_ctx.dot_productf(synth, synth, AMRWB_SFR_SIZE);
|
||||||
if (tmp > 0) {
|
|
||||||
tilt = tmp / ctx->celpm_ctx.dot_productf(synth, synth, AMRWB_SFR_SIZE);
|
|
||||||
} else
|
|
||||||
tilt = 0;
|
|
||||||
|
|
||||||
/* return gain bounded by [0.1, 1.0] */
|
/* return gain bounded by [0.1, 1.0] */
|
||||||
return av_clipf((1.0 - tilt) * (1.25 - 0.25 * wsp), 0.1, 1.0);
|
return av_clipf((1.0 - FFMAX(0.0, tilt)) * (1.25 - 0.25 * wsp), 0.1, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -119,9 +119,6 @@ static int decode_frame(AVCodecContext *avctx,
|
|||||||
uint8_t *dst, *dst_end;
|
uint8_t *dst, *dst_end;
|
||||||
int count, ret;
|
int count, ret;
|
||||||
|
|
||||||
if (buf_size < 7)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
|
if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
dst = s->frame->data[0];
|
dst = s->frame->data[0];
|
||||||
|
|||||||
+5
-7
@@ -80,6 +80,10 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
|||||||
AnsiContext *s = avctx->priv_data;
|
AnsiContext *s = avctx->priv_data;
|
||||||
avctx->pix_fmt = AV_PIX_FMT_PAL8;
|
avctx->pix_fmt = AV_PIX_FMT_PAL8;
|
||||||
|
|
||||||
|
s->frame = av_frame_alloc();
|
||||||
|
if (!s->frame)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
/* defaults */
|
/* defaults */
|
||||||
s->font = avpriv_vga16_font;
|
s->font = avpriv_vga16_font;
|
||||||
s->font_height = 16;
|
s->font_height = 16;
|
||||||
@@ -94,11 +98,6 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
|||||||
av_log(avctx, AV_LOG_ERROR, "Invalid dimensions %d %d\n", avctx->width, avctx->height);
|
av_log(avctx, AV_LOG_ERROR, "Invalid dimensions %d %d\n", avctx->width, avctx->height);
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
s->frame = av_frame_alloc();
|
|
||||||
if (!s->frame)
|
|
||||||
return AVERROR(ENOMEM);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -430,8 +429,7 @@ static int decode_frame(AVCodecContext *avctx,
|
|||||||
s->args[s->nb_args] = FFMAX(s->args[s->nb_args], 0) * 10 + buf[0] - '0';
|
s->args[s->nb_args] = FFMAX(s->args[s->nb_args], 0) * 10 + buf[0] - '0';
|
||||||
break;
|
break;
|
||||||
case ';':
|
case ';':
|
||||||
if (s->nb_args < MAX_NB_ARGS)
|
s->nb_args++;
|
||||||
s->nb_args++;
|
|
||||||
if (s->nb_args < MAX_NB_ARGS)
|
if (s->nb_args < MAX_NB_ARGS)
|
||||||
s->args[s->nb_args] = 0;
|
s->args[s->nb_args] = 0;
|
||||||
break;
|
break;
|
||||||
|
|||||||
+46
-50
@@ -101,7 +101,7 @@ typedef struct APEFilter {
|
|||||||
int16_t *historybuffer; ///< filter memory
|
int16_t *historybuffer; ///< filter memory
|
||||||
int16_t *delay; ///< filtered values
|
int16_t *delay; ///< filtered values
|
||||||
|
|
||||||
uint32_t avg;
|
int avg;
|
||||||
} APEFilter;
|
} APEFilter;
|
||||||
|
|
||||||
typedef struct APERice {
|
typedef struct APERice {
|
||||||
@@ -460,7 +460,7 @@ static inline void update_rice(APERice *rice, unsigned int x)
|
|||||||
|
|
||||||
if (rice->ksum < lim)
|
if (rice->ksum < lim)
|
||||||
rice->k--;
|
rice->k--;
|
||||||
else if (rice->ksum >= (1 << (rice->k + 5)) && rice->k < 24)
|
else if (rice->ksum >= (1 << (rice->k + 5)))
|
||||||
rice->k++;
|
rice->k++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -554,7 +554,7 @@ static inline int ape_decode_value_3990(APEContext *ctx, APERice *rice)
|
|||||||
overflow = range_get_symbol(ctx, counts_3980, counts_diff_3980);
|
overflow = range_get_symbol(ctx, counts_3980, counts_diff_3980);
|
||||||
|
|
||||||
if (overflow == (MODEL_ELEMENTS - 1)) {
|
if (overflow == (MODEL_ELEMENTS - 1)) {
|
||||||
overflow = (unsigned)range_decode_bits(ctx, 16) << 16;
|
overflow = range_decode_bits(ctx, 16) << 16;
|
||||||
overflow |= range_decode_bits(ctx, 16);
|
overflow |= range_decode_bits(ctx, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -589,7 +589,7 @@ static void decode_array_0000(APEContext *ctx, GetBitContext *gb,
|
|||||||
int32_t *out, APERice *rice, int blockstodecode)
|
int32_t *out, APERice *rice, int blockstodecode)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
unsigned ksummax, ksummin;
|
int ksummax, ksummin;
|
||||||
|
|
||||||
rice->ksum = 0;
|
rice->ksum = 0;
|
||||||
for (i = 0; i < FFMIN(blockstodecode, 5); i++) {
|
for (i = 0; i < FFMIN(blockstodecode, 5); i++) {
|
||||||
@@ -610,7 +610,7 @@ static void decode_array_0000(APEContext *ctx, GetBitContext *gb,
|
|||||||
ksummin = rice->k ? (1 << rice->k + 6) : 0;
|
ksummin = rice->k ? (1 << rice->k + 6) : 0;
|
||||||
for (; i < blockstodecode; i++) {
|
for (; i < blockstodecode; i++) {
|
||||||
out[i] = get_rice_ook(&ctx->gb, rice->k);
|
out[i] = get_rice_ook(&ctx->gb, rice->k);
|
||||||
rice->ksum += out[i] - (unsigned)out[i - 64];
|
rice->ksum += out[i] - out[i - 64];
|
||||||
while (rice->ksum < ksummin) {
|
while (rice->ksum < ksummin) {
|
||||||
rice->k--;
|
rice->k--;
|
||||||
ksummin = rice->k ? ksummin >> 1 : 0;
|
ksummin = rice->k ? ksummin >> 1 : 0;
|
||||||
@@ -836,7 +836,7 @@ static av_always_inline int filter_fast_3320(APEPredictor *p,
|
|||||||
else
|
else
|
||||||
p->coeffsA[filter][0]--;
|
p->coeffsA[filter][0]--;
|
||||||
|
|
||||||
p->filterA[filter] += (unsigned)p->lastA[filter];
|
p->filterA[filter] += p->lastA[filter];
|
||||||
|
|
||||||
return p->filterA[filter];
|
return p->filterA[filter];
|
||||||
}
|
}
|
||||||
@@ -859,9 +859,9 @@ static av_always_inline int filter_3800(APEPredictor *p,
|
|||||||
return predictionA;
|
return predictionA;
|
||||||
}
|
}
|
||||||
d2 = p->buf[delayA];
|
d2 = p->buf[delayA];
|
||||||
d1 = (p->buf[delayA] - (unsigned)p->buf[delayA - 1]) * 2;
|
d1 = (p->buf[delayA] - p->buf[delayA - 1]) << 1;
|
||||||
d0 = p->buf[delayA] + ((p->buf[delayA - 2] - (unsigned)p->buf[delayA - 1]) * 8);
|
d0 = p->buf[delayA] + ((p->buf[delayA - 2] - p->buf[delayA - 1]) << 3);
|
||||||
d3 = p->buf[delayB] * 2U - p->buf[delayB - 1];
|
d3 = p->buf[delayB] * 2 - p->buf[delayB - 1];
|
||||||
d4 = p->buf[delayB];
|
d4 = p->buf[delayB];
|
||||||
|
|
||||||
predictionA = d0 * p->coeffsA[filter][0] +
|
predictionA = d0 * p->coeffsA[filter][0] +
|
||||||
@@ -880,8 +880,8 @@ static av_always_inline int filter_3800(APEPredictor *p,
|
|||||||
p->coeffsB[filter][0] += (((d3 >> 29) & 4) - 2) * sign;
|
p->coeffsB[filter][0] += (((d3 >> 29) & 4) - 2) * sign;
|
||||||
p->coeffsB[filter][1] -= (((d4 >> 30) & 2) - 1) * sign;
|
p->coeffsB[filter][1] -= (((d4 >> 30) & 2) - 1) * sign;
|
||||||
|
|
||||||
p->filterB[filter] = p->lastA[filter] + (unsigned)(predictionB >> shift);
|
p->filterB[filter] = p->lastA[filter] + (predictionB >> shift);
|
||||||
p->filterA[filter] = p->filterB[filter] + (unsigned)((int)(p->filterA[filter] * 31U) >> 5);
|
p->filterA[filter] = p->filterB[filter] + ((p->filterA[filter] * 31) >> 5);
|
||||||
|
|
||||||
return p->filterA[filter];
|
return p->filterA[filter];
|
||||||
}
|
}
|
||||||
@@ -902,10 +902,10 @@ static void long_filter_high_3800(int32_t *buffer, int order, int shift, int len
|
|||||||
dotprod = 0;
|
dotprod = 0;
|
||||||
sign = APESIGN(buffer[i]);
|
sign = APESIGN(buffer[i]);
|
||||||
for (j = 0; j < order; j++) {
|
for (j = 0; j < order; j++) {
|
||||||
dotprod += delay[j] * (unsigned)coeffs[j];
|
dotprod += delay[j] * coeffs[j];
|
||||||
coeffs[j] += ((delay[j] >> 31) | 1) * sign;
|
coeffs[j] += ((delay[j] >> 31) | 1) * sign;
|
||||||
}
|
}
|
||||||
buffer[i] -= (unsigned)(dotprod >> shift);
|
buffer[i] -= dotprod >> shift;
|
||||||
for (j = 0; j < order - 1; j++)
|
for (j = 0; j < order - 1; j++)
|
||||||
delay[j] = delay[j + 1];
|
delay[j] = delay[j + 1];
|
||||||
delay[order - 1] = buffer[i];
|
delay[order - 1] = buffer[i];
|
||||||
@@ -916,8 +916,7 @@ static void long_filter_ehigh_3830(int32_t *buffer, int length)
|
|||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
int32_t dotprod, sign;
|
int32_t dotprod, sign;
|
||||||
int32_t delay[8] = { 0 };
|
int32_t coeffs[8] = { 0 }, delay[8] = { 0 };
|
||||||
uint32_t coeffs[8] = { 0 };
|
|
||||||
|
|
||||||
for (i = 0; i < length; i++) {
|
for (i = 0; i < length; i++) {
|
||||||
dotprod = 0;
|
dotprod = 0;
|
||||||
@@ -929,7 +928,7 @@ static void long_filter_ehigh_3830(int32_t *buffer, int length)
|
|||||||
for (j = 7; j > 0; j--)
|
for (j = 7; j > 0; j--)
|
||||||
delay[j] = delay[j - 1];
|
delay[j] = delay[j - 1];
|
||||||
delay[0] = buffer[i];
|
delay[0] = buffer[i];
|
||||||
buffer[i] -= (unsigned)(dotprod >> 9);
|
buffer[i] -= dotprod >> 9;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1038,13 +1037,13 @@ static av_always_inline int predictor_update_3930(APEPredictor *p,
|
|||||||
const int delayA)
|
const int delayA)
|
||||||
{
|
{
|
||||||
int32_t predictionA, sign;
|
int32_t predictionA, sign;
|
||||||
uint32_t d0, d1, d2, d3;
|
int32_t d0, d1, d2, d3;
|
||||||
|
|
||||||
p->buf[delayA] = p->lastA[filter];
|
p->buf[delayA] = p->lastA[filter];
|
||||||
d0 = p->buf[delayA ];
|
d0 = p->buf[delayA ];
|
||||||
d1 = p->buf[delayA ] - (unsigned)p->buf[delayA - 1];
|
d1 = p->buf[delayA ] - p->buf[delayA - 1];
|
||||||
d2 = p->buf[delayA - 1] - (unsigned)p->buf[delayA - 2];
|
d2 = p->buf[delayA - 1] - p->buf[delayA - 2];
|
||||||
d3 = p->buf[delayA - 2] - (unsigned)p->buf[delayA - 3];
|
d3 = p->buf[delayA - 2] - p->buf[delayA - 3];
|
||||||
|
|
||||||
predictionA = d0 * p->coeffsA[filter][0] +
|
predictionA = d0 * p->coeffsA[filter][0] +
|
||||||
d1 * p->coeffsA[filter][1] +
|
d1 * p->coeffsA[filter][1] +
|
||||||
@@ -1052,13 +1051,13 @@ static av_always_inline int predictor_update_3930(APEPredictor *p,
|
|||||||
d3 * p->coeffsA[filter][3];
|
d3 * p->coeffsA[filter][3];
|
||||||
|
|
||||||
p->lastA[filter] = decoded + (predictionA >> 9);
|
p->lastA[filter] = decoded + (predictionA >> 9);
|
||||||
p->filterA[filter] = p->lastA[filter] + ((int)(p->filterA[filter] * 31U) >> 5);
|
p->filterA[filter] = p->lastA[filter] + ((p->filterA[filter] * 31) >> 5);
|
||||||
|
|
||||||
sign = APESIGN(decoded);
|
sign = APESIGN(decoded);
|
||||||
p->coeffsA[filter][0] += (((int32_t)d0 < 0) * 2 - 1) * sign;
|
p->coeffsA[filter][0] += ((d0 < 0) * 2 - 1) * sign;
|
||||||
p->coeffsA[filter][1] += (((int32_t)d1 < 0) * 2 - 1) * sign;
|
p->coeffsA[filter][1] += ((d1 < 0) * 2 - 1) * sign;
|
||||||
p->coeffsA[filter][2] += (((int32_t)d2 < 0) * 2 - 1) * sign;
|
p->coeffsA[filter][2] += ((d2 < 0) * 2 - 1) * sign;
|
||||||
p->coeffsA[filter][3] += (((int32_t)d3 < 0) * 2 - 1) * sign;
|
p->coeffsA[filter][3] += ((d3 < 0) * 2 - 1) * sign;
|
||||||
|
|
||||||
return p->filterA[filter];
|
return p->filterA[filter];
|
||||||
}
|
}
|
||||||
@@ -1122,7 +1121,7 @@ static av_always_inline int predictor_update_filter(APEPredictor *p,
|
|||||||
|
|
||||||
p->buf[delayA] = p->lastA[filter];
|
p->buf[delayA] = p->lastA[filter];
|
||||||
p->buf[adaptA] = APESIGN(p->buf[delayA]);
|
p->buf[adaptA] = APESIGN(p->buf[delayA]);
|
||||||
p->buf[delayA - 1] = p->buf[delayA] - (unsigned)p->buf[delayA - 1];
|
p->buf[delayA - 1] = p->buf[delayA] - p->buf[delayA - 1];
|
||||||
p->buf[adaptA - 1] = APESIGN(p->buf[delayA - 1]);
|
p->buf[adaptA - 1] = APESIGN(p->buf[delayA - 1]);
|
||||||
|
|
||||||
predictionA = p->buf[delayA ] * p->coeffsA[filter][0] +
|
predictionA = p->buf[delayA ] * p->coeffsA[filter][0] +
|
||||||
@@ -1131,9 +1130,9 @@ static av_always_inline int predictor_update_filter(APEPredictor *p,
|
|||||||
p->buf[delayA - 3] * p->coeffsA[filter][3];
|
p->buf[delayA - 3] * p->coeffsA[filter][3];
|
||||||
|
|
||||||
/* Apply a scaled first-order filter compression */
|
/* Apply a scaled first-order filter compression */
|
||||||
p->buf[delayB] = p->filterA[filter ^ 1] - ((int)(p->filterB[filter] * 31U) >> 5);
|
p->buf[delayB] = p->filterA[filter ^ 1] - ((p->filterB[filter] * 31) >> 5);
|
||||||
p->buf[adaptB] = APESIGN(p->buf[delayB]);
|
p->buf[adaptB] = APESIGN(p->buf[delayB]);
|
||||||
p->buf[delayB - 1] = p->buf[delayB] - (unsigned)p->buf[delayB - 1];
|
p->buf[delayB - 1] = p->buf[delayB] - p->buf[delayB - 1];
|
||||||
p->buf[adaptB - 1] = APESIGN(p->buf[delayB - 1]);
|
p->buf[adaptB - 1] = APESIGN(p->buf[delayB - 1]);
|
||||||
p->filterB[filter] = p->filterA[filter ^ 1];
|
p->filterB[filter] = p->filterA[filter ^ 1];
|
||||||
|
|
||||||
@@ -1143,8 +1142,8 @@ static av_always_inline int predictor_update_filter(APEPredictor *p,
|
|||||||
p->buf[delayB - 3] * p->coeffsB[filter][3] +
|
p->buf[delayB - 3] * p->coeffsB[filter][3] +
|
||||||
p->buf[delayB - 4] * p->coeffsB[filter][4];
|
p->buf[delayB - 4] * p->coeffsB[filter][4];
|
||||||
|
|
||||||
p->lastA[filter] = decoded + ((int)((unsigned)predictionA + (predictionB >> 1)) >> 10);
|
p->lastA[filter] = decoded + ((predictionA + (predictionB >> 1)) >> 10);
|
||||||
p->filterA[filter] = p->lastA[filter] + ((int)(p->filterA[filter] * 31U) >> 5);
|
p->filterA[filter] = p->lastA[filter] + ((p->filterA[filter] * 31) >> 5);
|
||||||
|
|
||||||
sign = APESIGN(decoded);
|
sign = APESIGN(decoded);
|
||||||
p->coeffsA[filter][0] += p->buf[adaptA ] * sign;
|
p->coeffsA[filter][0] += p->buf[adaptA ] * sign;
|
||||||
@@ -1203,14 +1202,14 @@ static void predictor_decode_mono_3950(APEContext *ctx, int count)
|
|||||||
A = *decoded0;
|
A = *decoded0;
|
||||||
|
|
||||||
p->buf[YDELAYA] = currentA;
|
p->buf[YDELAYA] = currentA;
|
||||||
p->buf[YDELAYA - 1] = p->buf[YDELAYA] - (unsigned)p->buf[YDELAYA - 1];
|
p->buf[YDELAYA - 1] = p->buf[YDELAYA] - p->buf[YDELAYA - 1];
|
||||||
|
|
||||||
predictionA = p->buf[YDELAYA ] * p->coeffsA[0][0] +
|
predictionA = p->buf[YDELAYA ] * p->coeffsA[0][0] +
|
||||||
p->buf[YDELAYA - 1] * p->coeffsA[0][1] +
|
p->buf[YDELAYA - 1] * p->coeffsA[0][1] +
|
||||||
p->buf[YDELAYA - 2] * p->coeffsA[0][2] +
|
p->buf[YDELAYA - 2] * p->coeffsA[0][2] +
|
||||||
p->buf[YDELAYA - 3] * p->coeffsA[0][3];
|
p->buf[YDELAYA - 3] * p->coeffsA[0][3];
|
||||||
|
|
||||||
currentA = A + (unsigned)(predictionA >> 10);
|
currentA = A + (predictionA >> 10);
|
||||||
|
|
||||||
p->buf[YADAPTCOEFFSA] = APESIGN(p->buf[YDELAYA ]);
|
p->buf[YADAPTCOEFFSA] = APESIGN(p->buf[YDELAYA ]);
|
||||||
p->buf[YADAPTCOEFFSA - 1] = APESIGN(p->buf[YDELAYA - 1]);
|
p->buf[YADAPTCOEFFSA - 1] = APESIGN(p->buf[YDELAYA - 1]);
|
||||||
@@ -1230,7 +1229,7 @@ static void predictor_decode_mono_3950(APEContext *ctx, int count)
|
|||||||
p->buf = p->historybuffer;
|
p->buf = p->historybuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
p->filterA[0] = currentA + (unsigned)((int)(p->filterA[0] * 31U) >> 5);
|
p->filterA[0] = currentA + ((p->filterA[0] * 31) >> 5);
|
||||||
*(decoded0++) = p->filterA[0];
|
*(decoded0++) = p->filterA[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1267,8 +1266,8 @@ static void do_apply_filter(APEContext *ctx, int version, APEFilter *f,
|
|||||||
f->delay - order,
|
f->delay - order,
|
||||||
f->adaptcoeffs - order,
|
f->adaptcoeffs - order,
|
||||||
order, APESIGN(*data));
|
order, APESIGN(*data));
|
||||||
res = (int)(res + (1U << (fracbits - 1))) >> fracbits;
|
res = (res + (1 << (fracbits - 1))) >> fracbits;
|
||||||
res += (unsigned)*data;
|
res += *data;
|
||||||
*data++ = res;
|
*data++ = res;
|
||||||
|
|
||||||
/* Update the output history */
|
/* Update the output history */
|
||||||
@@ -1283,10 +1282,10 @@ static void do_apply_filter(APEContext *ctx, int version, APEFilter *f,
|
|||||||
/* Version 3.98 and later files */
|
/* Version 3.98 and later files */
|
||||||
|
|
||||||
/* Update the adaption coefficients */
|
/* Update the adaption coefficients */
|
||||||
absres = res < 0 ? -(unsigned)res : res;
|
absres = FFABS(res);
|
||||||
if (absres)
|
if (absres)
|
||||||
*f->adaptcoeffs = APESIGN(res) *
|
*f->adaptcoeffs = APESIGN(res) *
|
||||||
(8 << ((absres > f->avg * 3LL) + (absres > (f->avg + f->avg / 3))));
|
(8 << ((absres > f->avg * 3) + (absres > f->avg * 4 / 3)));
|
||||||
/* equivalent to the following code
|
/* equivalent to the following code
|
||||||
if (absres <= f->avg * 4 / 3)
|
if (absres <= f->avg * 4 / 3)
|
||||||
*f->adaptcoeffs = APESIGN(res) * 8;
|
*f->adaptcoeffs = APESIGN(res) * 8;
|
||||||
@@ -1298,7 +1297,7 @@ static void do_apply_filter(APEContext *ctx, int version, APEFilter *f,
|
|||||||
else
|
else
|
||||||
*f->adaptcoeffs = 0;
|
*f->adaptcoeffs = 0;
|
||||||
|
|
||||||
f->avg += (int)(absres - (unsigned)f->avg) / 16;
|
f->avg += (absres - f->avg) / 16;
|
||||||
|
|
||||||
f->adaptcoeffs[-1] >>= 1;
|
f->adaptcoeffs[-1] >>= 1;
|
||||||
f->adaptcoeffs[-2] >>= 1;
|
f->adaptcoeffs[-2] >>= 1;
|
||||||
@@ -1377,7 +1376,7 @@ static void ape_unpack_mono(APEContext *ctx, int count)
|
|||||||
|
|
||||||
static void ape_unpack_stereo(APEContext *ctx, int count)
|
static void ape_unpack_stereo(APEContext *ctx, int count)
|
||||||
{
|
{
|
||||||
unsigned left, right;
|
int32_t left, right;
|
||||||
int32_t *decoded0 = ctx->decoded[0];
|
int32_t *decoded0 = ctx->decoded[0];
|
||||||
int32_t *decoded1 = ctx->decoded[1];
|
int32_t *decoded1 = ctx->decoded[1];
|
||||||
|
|
||||||
@@ -1394,7 +1393,7 @@ static void ape_unpack_stereo(APEContext *ctx, int count)
|
|||||||
|
|
||||||
/* Decorrelate and scale to output depth */
|
/* Decorrelate and scale to output depth */
|
||||||
while (count--) {
|
while (count--) {
|
||||||
left = *decoded1 - (unsigned)(*decoded0 / 2);
|
left = *decoded1 - (*decoded0 / 2);
|
||||||
right = left + *decoded0;
|
right = left + *decoded0;
|
||||||
|
|
||||||
*(decoded0++) = left;
|
*(decoded0++) = left;
|
||||||
@@ -1413,7 +1412,6 @@ static int ape_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
int32_t *sample24;
|
int32_t *sample24;
|
||||||
int i, ch, ret;
|
int i, ch, ret;
|
||||||
int blockstodecode;
|
int blockstodecode;
|
||||||
uint64_t decoded_buffer_size;
|
|
||||||
|
|
||||||
/* this should never be negative, but bad things will happen if it is, so
|
/* this should never be negative, but bad things will happen if it is, so
|
||||||
check it just to make sure. */
|
check it just to make sure. */
|
||||||
@@ -1452,8 +1450,7 @@ static int ape_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
if (s->fileversion >= 3900) {
|
if (s->fileversion >= 3900) {
|
||||||
if (offset > 3) {
|
if (offset > 3) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Incorrect offset passed\n");
|
av_log(avctx, AV_LOG_ERROR, "Incorrect offset passed\n");
|
||||||
av_freep(&s->data);
|
s->data = NULL;
|
||||||
s->data_size = 0;
|
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
if (s->data_end - s->ptr < offset) {
|
if (s->data_end - s->ptr < offset) {
|
||||||
@@ -1470,7 +1467,7 @@ static int ape_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
skip_bits_long(&s->gb, offset);
|
skip_bits_long(&s->gb, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!nblocks || nblocks > INT_MAX / 2 / sizeof(*s->decoded_buffer) - 8) {
|
if (!nblocks || nblocks > INT_MAX) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Invalid sample count: %"PRIu32".\n",
|
av_log(avctx, AV_LOG_ERROR, "Invalid sample count: %"PRIu32".\n",
|
||||||
nblocks);
|
nblocks);
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
@@ -1496,12 +1493,11 @@ static int ape_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
blockstodecode = s->samples;
|
blockstodecode = s->samples;
|
||||||
|
|
||||||
/* reallocate decoded sample buffer if needed */
|
/* reallocate decoded sample buffer if needed */
|
||||||
decoded_buffer_size = 2LL * FFALIGN(blockstodecode, 8) * sizeof(*s->decoded_buffer);
|
av_fast_malloc(&s->decoded_buffer, &s->decoded_size,
|
||||||
av_assert0(decoded_buffer_size <= INT_MAX);
|
2 * FFALIGN(blockstodecode, 8) * sizeof(*s->decoded_buffer));
|
||||||
av_fast_malloc(&s->decoded_buffer, &s->decoded_size, decoded_buffer_size);
|
|
||||||
if (!s->decoded_buffer)
|
if (!s->decoded_buffer)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
memset(s->decoded_buffer, 0, decoded_buffer_size);
|
memset(s->decoded_buffer, 0, s->decoded_size);
|
||||||
s->decoded[0] = s->decoded_buffer;
|
s->decoded[0] = s->decoded_buffer;
|
||||||
s->decoded[1] = s->decoded_buffer + FFALIGN(blockstodecode, 8);
|
s->decoded[1] = s->decoded_buffer + FFALIGN(blockstodecode, 8);
|
||||||
|
|
||||||
@@ -1529,7 +1525,7 @@ static int ape_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
for (ch = 0; ch < s->channels; ch++) {
|
for (ch = 0; ch < s->channels; ch++) {
|
||||||
sample8 = (uint8_t *)frame->data[ch];
|
sample8 = (uint8_t *)frame->data[ch];
|
||||||
for (i = 0; i < blockstodecode; i++)
|
for (i = 0; i < blockstodecode; i++)
|
||||||
*sample8++ = (s->decoded[ch][i] + 0x80U) & 0xff;
|
*sample8++ = (s->decoded[ch][i] + 0x80) & 0xff;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 16:
|
case 16:
|
||||||
@@ -1543,7 +1539,7 @@ static int ape_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
for (ch = 0; ch < s->channels; ch++) {
|
for (ch = 0; ch < s->channels; ch++) {
|
||||||
sample24 = (int32_t *)frame->data[ch];
|
sample24 = (int32_t *)frame->data[ch];
|
||||||
for (i = 0; i < blockstodecode; i++)
|
for (i = 0; i < blockstodecode; i++)
|
||||||
*sample24++ = s->decoded[ch][i] * 256U;
|
*sample24++ = s->decoded[ch][i] << 8;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -336,11 +336,11 @@ function ff_sbr_hf_apply_noise_0_neon, export=1
|
|||||||
vld1.32 {d0}, [r0,:64]
|
vld1.32 {d0}, [r0,:64]
|
||||||
vld1.32 {d6}, [lr,:64]
|
vld1.32 {d6}, [lr,:64]
|
||||||
vld1.32 {d2[]}, [r1,:32]!
|
vld1.32 {d2[]}, [r1,:32]!
|
||||||
vld1.32 {d18[]}, [r2,:32]!
|
vld1.32 {d3[]}, [r2,:32]!
|
||||||
vceq.f32 d4, d2, #0
|
vceq.f32 d4, d2, #0
|
||||||
veor d2, d2, d3
|
veor d2, d2, d3
|
||||||
vmov d1, d0
|
vmov d1, d0
|
||||||
vmla.f32 d0, d6, d18
|
vmla.f32 d0, d6, d3
|
||||||
vadd.f32 s2, s2, s4
|
vadd.f32 s2, s2, s4
|
||||||
vbif d0, d1, d4
|
vbif d0, d1, d4
|
||||||
vst1.32 {d0}, [r0,:64]!
|
vst1.32 {d0}, [r0,:64]!
|
||||||
|
|||||||
@@ -275,7 +275,7 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf)
|
|||||||
}
|
}
|
||||||
if (section->format_header && !order) {
|
if (section->format_header && !order) {
|
||||||
len = strlen(section->format_header);
|
len = strlen(section->format_header);
|
||||||
if (!strncmp(buf, section->format_header, len) && buf[len] == ':') {
|
if (buf[len] == ':' && !strncmp(buf, section->format_header, len)) {
|
||||||
buf += len + 1;
|
buf += len + 1;
|
||||||
while (!is_eol(*buf)) {
|
while (!is_eol(*buf)) {
|
||||||
buf = skip_space(buf);
|
buf = skip_space(buf);
|
||||||
|
|||||||
+1
-2
@@ -31,8 +31,7 @@ static av_cold int ass_decode_init(AVCodecContext *avctx)
|
|||||||
avctx->subtitle_header = av_malloc(avctx->extradata_size + 1);
|
avctx->subtitle_header = av_malloc(avctx->extradata_size + 1);
|
||||||
if (!avctx->subtitle_header)
|
if (!avctx->subtitle_header)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
if (avctx->extradata_size)
|
memcpy(avctx->subtitle_header, avctx->extradata, avctx->extradata_size);
|
||||||
memcpy(avctx->subtitle_header, avctx->extradata, avctx->extradata_size);
|
|
||||||
avctx->subtitle_header[avctx->extradata_size] = 0;
|
avctx->subtitle_header[avctx->extradata_size] = 0;
|
||||||
avctx->subtitle_header_size = avctx->extradata_size;
|
avctx->subtitle_header_size = avctx->extradata_size;
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
+1
-1
@@ -882,7 +882,7 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx)
|
|||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (avctx->block_align > 1024 || avctx->block_align <= 0)
|
if (avctx->block_align >= UINT_MAX / 2)
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
|
|
||||||
q->decoded_bytes_buffer = av_mallocz(FFALIGN(avctx->block_align, 4) +
|
q->decoded_bytes_buffer = av_mallocz(FFALIGN(avctx->block_align, 4) +
|
||||||
|
|||||||
@@ -456,10 +456,6 @@ static int decode_channel_wordlen(GetBitContext *gb, Atrac3pChanUnitCtx *ctx,
|
|||||||
} else if (chan->fill_mode == 3) {
|
} else if (chan->fill_mode == 3) {
|
||||||
pos = ch_num ? chan->num_coded_vals + chan->split_point
|
pos = ch_num ? chan->num_coded_vals + chan->split_point
|
||||||
: ctx->num_quant_units - chan->split_point;
|
: ctx->num_quant_units - chan->split_point;
|
||||||
if (pos > FF_ARRAY_ELEMS(chan->qu_wordlen)) {
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "Split point beyond array\n");
|
|
||||||
pos = FF_ARRAY_ELEMS(chan->qu_wordlen);
|
|
||||||
}
|
|
||||||
for (i = chan->num_coded_vals; i < pos; i++)
|
for (i = chan->num_coded_vals; i < pos; i++)
|
||||||
chan->qu_wordlen[i] = 1;
|
chan->qu_wordlen[i] = 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ static void vector_clipf_c(float *dst, const float *src,
|
|||||||
static int32_t scalarproduct_int16_c(const int16_t *v1, const int16_t *v2,
|
static int32_t scalarproduct_int16_c(const int16_t *v1, const int16_t *v2,
|
||||||
int order)
|
int order)
|
||||||
{
|
{
|
||||||
unsigned res = 0;
|
int res = 0;
|
||||||
|
|
||||||
while (order--)
|
while (order--)
|
||||||
res += *v1++ **v2++;
|
res += *v1++ **v2++;
|
||||||
|
|||||||
+9
-13
@@ -1526,7 +1526,7 @@ enum AVPacketSideDataType {
|
|||||||
AV_PKT_DATA_METADATA_UPDATE,
|
AV_PKT_DATA_METADATA_UPDATE,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MPEGTS stream ID as uint8_t, this is required to pass the stream ID
|
* MPEGTS stream ID, this is required to pass the stream ID
|
||||||
* information from the demuxer to the corresponding muxer.
|
* information from the demuxer to the corresponding muxer.
|
||||||
*/
|
*/
|
||||||
AV_PKT_DATA_MPEGTS_STREAM_ID,
|
AV_PKT_DATA_MPEGTS_STREAM_ID,
|
||||||
@@ -1536,17 +1536,7 @@ enum AVPacketSideDataType {
|
|||||||
* should be associated with a video stream and containts data in the form
|
* should be associated with a video stream and containts data in the form
|
||||||
* of the AVMasteringDisplayMetadata struct.
|
* of the AVMasteringDisplayMetadata struct.
|
||||||
*/
|
*/
|
||||||
AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
|
AV_PKT_DATA_MASTERING_DISPLAY_METADATA
|
||||||
|
|
||||||
/**
|
|
||||||
* The number of side data elements (in fact a bit more than it).
|
|
||||||
* This is not part of the public API/ABI in the sense that it may
|
|
||||||
* change when new side data types are added.
|
|
||||||
* This must stay the last enum value.
|
|
||||||
* If its value becomes huge, some code using it
|
|
||||||
* needs to be updated as it assumes it to be smaller than other limits.
|
|
||||||
*/
|
|
||||||
AV_PKT_DATA_NB
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED
|
#define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED
|
||||||
@@ -2888,7 +2878,6 @@ typedef struct AVCodecContext {
|
|||||||
#define FF_BUG_DC_CLIP 4096
|
#define FF_BUG_DC_CLIP 4096
|
||||||
#define FF_BUG_MS 8192 ///< Work around various bugs in Microsoft's broken decoders.
|
#define FF_BUG_MS 8192 ///< Work around various bugs in Microsoft's broken decoders.
|
||||||
#define FF_BUG_TRUNCATED 16384
|
#define FF_BUG_TRUNCATED 16384
|
||||||
#define FF_BUG_IEDGE 32768
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* strictly follow the standard (MPEG-4, ...).
|
* strictly follow the standard (MPEG-4, ...).
|
||||||
@@ -5577,8 +5566,15 @@ enum AVPixelFormat avcodec_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt
|
|||||||
enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr);
|
enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr);
|
||||||
|
|
||||||
attribute_deprecated
|
attribute_deprecated
|
||||||
|
#if AV_HAVE_INCOMPATIBLE_LIBAV_ABI
|
||||||
|
enum AVPixelFormat avcodec_find_best_pix_fmt2(const enum AVPixelFormat *pix_fmt_list,
|
||||||
|
enum AVPixelFormat src_pix_fmt,
|
||||||
|
int has_alpha, int *loss_ptr);
|
||||||
|
#else
|
||||||
enum AVPixelFormat avcodec_find_best_pix_fmt2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2,
|
enum AVPixelFormat avcodec_find_best_pix_fmt2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2,
|
||||||
enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr);
|
enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum AVPixelFormat * fmt);
|
enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum AVPixelFormat * fmt);
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -109,7 +109,7 @@ int avcodec_dct_init(AVDCT *dsp)
|
|||||||
|
|
||||||
#if CONFIG_IDCTDSP
|
#if CONFIG_IDCTDSP
|
||||||
{
|
{
|
||||||
IDCTDSPContext idsp = {0};
|
IDCTDSPContext idsp;
|
||||||
ff_idctdsp_init(&idsp, avctx);
|
ff_idctdsp_init(&idsp, avctx);
|
||||||
COPY(idsp, idct);
|
COPY(idsp, idct);
|
||||||
COPY(idsp, idct_permutation);
|
COPY(idsp, idct_permutation);
|
||||||
|
|||||||
+4
-10
@@ -295,17 +295,16 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
|||||||
int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
|
int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
|
||||||
uint8_t *data, size_t size)
|
uint8_t *data, size_t size)
|
||||||
{
|
{
|
||||||
AVPacketSideData *tmp;
|
|
||||||
int elems = pkt->side_data_elems;
|
int elems = pkt->side_data_elems;
|
||||||
|
|
||||||
if ((unsigned)elems + 1 > AV_PKT_DATA_NB)
|
if ((unsigned)elems + 1 > INT_MAX / sizeof(*pkt->side_data))
|
||||||
return AVERROR(ERANGE);
|
return AVERROR(ERANGE);
|
||||||
|
|
||||||
tmp = av_realloc(pkt->side_data, (elems + 1) * sizeof(*tmp));
|
pkt->side_data = av_realloc(pkt->side_data,
|
||||||
if (!tmp)
|
(elems + 1) * sizeof(*pkt->side_data));
|
||||||
|
if (!pkt->side_data)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
pkt->side_data = tmp;
|
|
||||||
pkt->side_data[elems].data = data;
|
pkt->side_data[elems].data = data;
|
||||||
pkt->side_data[elems].size = size;
|
pkt->side_data[elems].size = size;
|
||||||
pkt->side_data[elems].type = type;
|
pkt->side_data[elems].type = type;
|
||||||
@@ -348,8 +347,6 @@ uint8_t *av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
|
|||||||
return pkt->side_data[i].data;
|
return pkt->side_data[i].data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (size)
|
|
||||||
*size = 0;
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -433,9 +430,6 @@ int av_packet_split_side_data(AVPacket *pkt){
|
|||||||
p-= size+5;
|
p-= size+5;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i > AV_PKT_DATA_NB)
|
|
||||||
return AVERROR(ERANGE);
|
|
||||||
|
|
||||||
pkt->side_data = av_malloc_array(i, sizeof(*pkt->side_data));
|
pkt->side_data = av_malloc_array(i, sizeof(*pkt->side_data));
|
||||||
if (!pkt->side_data)
|
if (!pkt->side_data)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|||||||
@@ -109,11 +109,6 @@ static int bethsoftvid_decode_frame(AVCodecContext *avctx,
|
|||||||
if(yoffset >= avctx->height)
|
if(yoffset >= avctx->height)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
dst += vid->frame->linesize[0] * yoffset;
|
dst += vid->frame->linesize[0] * yoffset;
|
||||||
case VIDEO_P_FRAME:
|
|
||||||
case VIDEO_I_FRAME:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// main code
|
// main code
|
||||||
|
|||||||
+1
-6
@@ -485,17 +485,12 @@ av_cold void ff_bgmc_end(uint8_t **cf_lut, int **cf_lut_status)
|
|||||||
|
|
||||||
|
|
||||||
/** Initialize decoding and reads the first value */
|
/** Initialize decoding and reads the first value */
|
||||||
int ff_bgmc_decode_init(GetBitContext *gb, unsigned int *h,
|
void ff_bgmc_decode_init(GetBitContext *gb, unsigned int *h,
|
||||||
unsigned int *l, unsigned int *v)
|
unsigned int *l, unsigned int *v)
|
||||||
{
|
{
|
||||||
if (get_bits_left(gb) < VALUE_BITS)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
*h = TOP_VALUE;
|
*h = TOP_VALUE;
|
||||||
*l = 0;
|
*l = 0;
|
||||||
*v = get_bits_long(gb, VALUE_BITS);
|
*v = get_bits_long(gb, VALUE_BITS);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -40,7 +40,7 @@ int ff_bgmc_init(AVCodecContext *avctx, uint8_t **cf_lut, int **cf_lut_status);
|
|||||||
void ff_bgmc_end(uint8_t **cf_lut, int **cf_lut_status);
|
void ff_bgmc_end(uint8_t **cf_lut, int **cf_lut_status);
|
||||||
|
|
||||||
|
|
||||||
int ff_bgmc_decode_init(GetBitContext *gb,
|
void ff_bgmc_decode_init(GetBitContext *gb,
|
||||||
unsigned int *h, unsigned int *l, unsigned int *v);
|
unsigned int *h, unsigned int *l, unsigned int *v);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -1026,7 +1026,7 @@ static int bink_decode_plane(BinkContext *c, AVFrame *frame, GetBitContext *gb,
|
|||||||
for (bx = 0; bx < bw; bx++, dst += 8, prev += 8) {
|
for (bx = 0; bx < bw; bx++, dst += 8, prev += 8) {
|
||||||
blk = get_value(c, BINK_SRC_BLOCK_TYPES);
|
blk = get_value(c, BINK_SRC_BLOCK_TYPES);
|
||||||
// 16x16 block type on odd line means part of the already decoded block, so skip it
|
// 16x16 block type on odd line means part of the already decoded block, so skip it
|
||||||
if (((by & 1) || (bx & 1)) && blk == SCALED_BLOCK) {
|
if ((by & 1) && blk == SCALED_BLOCK) {
|
||||||
bx++;
|
bx++;
|
||||||
dst += 8;
|
dst += 8;
|
||||||
prev += 8;
|
prev += 8;
|
||||||
@@ -1299,13 +1299,13 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
|||||||
}
|
}
|
||||||
c->avctx = avctx;
|
c->avctx = avctx;
|
||||||
|
|
||||||
if ((ret = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
c->last = av_frame_alloc();
|
c->last = av_frame_alloc();
|
||||||
if (!c->last)
|
if (!c->last)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
|
if ((ret = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
avctx->pix_fmt = c->has_alpha ? AV_PIX_FMT_YUVA420P : AV_PIX_FMT_YUV420P;
|
avctx->pix_fmt = c->has_alpha ? AV_PIX_FMT_YUVA420P : AV_PIX_FMT_YUV420P;
|
||||||
|
|
||||||
ff_blockdsp_init(&c->bdsp, avctx);
|
ff_blockdsp_init(&c->bdsp, avctx);
|
||||||
|
|||||||
@@ -94,8 +94,6 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
|||||||
if (avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT) {
|
if (avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT) {
|
||||||
// audio is already interleaved for the RDFT format variant
|
// audio is already interleaved for the RDFT format variant
|
||||||
avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
|
avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
|
||||||
if (sample_rate > INT_MAX / avctx->channels)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
sample_rate *= avctx->channels;
|
sample_rate *= avctx->channels;
|
||||||
s->channels = 1;
|
s->channels = 1;
|
||||||
if (!s->version_b)
|
if (!s->version_b)
|
||||||
@@ -108,7 +106,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
|||||||
s->frame_len = 1 << frame_len_bits;
|
s->frame_len = 1 << frame_len_bits;
|
||||||
s->overlap_len = s->frame_len / 16;
|
s->overlap_len = s->frame_len / 16;
|
||||||
s->block_size = (s->frame_len - s->overlap_len) * s->channels;
|
s->block_size = (s->frame_len - s->overlap_len) * s->channels;
|
||||||
sample_rate_half = (sample_rate + 1LL) / 2;
|
sample_rate_half = (sample_rate + 1) / 2;
|
||||||
if (avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT)
|
if (avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT)
|
||||||
s->root = 2.0 / (sqrt(s->frame_len) * 32768.0);
|
s->root = 2.0 / (sqrt(s->frame_len) * 32768.0);
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -33,22 +33,20 @@
|
|||||||
#define A3 3784
|
#define A3 3784
|
||||||
#define A4 -5352
|
#define A4 -5352
|
||||||
|
|
||||||
#define MUL(X,Y) ((int)((unsigned)(X) * (Y)) >> 11)
|
|
||||||
|
|
||||||
#define IDCT_TRANSFORM(dest,s0,s1,s2,s3,s4,s5,s6,s7,d0,d1,d2,d3,d4,d5,d6,d7,munge,src) {\
|
#define IDCT_TRANSFORM(dest,s0,s1,s2,s3,s4,s5,s6,s7,d0,d1,d2,d3,d4,d5,d6,d7,munge,src) {\
|
||||||
const int a0 = (src)[s0] + (src)[s4]; \
|
const int a0 = (src)[s0] + (src)[s4]; \
|
||||||
const int a1 = (src)[s0] - (src)[s4]; \
|
const int a1 = (src)[s0] - (src)[s4]; \
|
||||||
const int a2 = (src)[s2] + (src)[s6]; \
|
const int a2 = (src)[s2] + (src)[s6]; \
|
||||||
const int a3 = MUL(A1, (src)[s2] - (src)[s6]); \
|
const int a3 = (A1*((src)[s2] - (src)[s6])) >> 11; \
|
||||||
const int a4 = (src)[s5] + (src)[s3]; \
|
const int a4 = (src)[s5] + (src)[s3]; \
|
||||||
const int a5 = (src)[s5] - (src)[s3]; \
|
const int a5 = (src)[s5] - (src)[s3]; \
|
||||||
const int a6 = (src)[s1] + (src)[s7]; \
|
const int a6 = (src)[s1] + (src)[s7]; \
|
||||||
const int a7 = (src)[s1] - (src)[s7]; \
|
const int a7 = (src)[s1] - (src)[s7]; \
|
||||||
const int b0 = a4 + a6; \
|
const int b0 = a4 + a6; \
|
||||||
const int b1 = MUL(A3, a5 + a7); \
|
const int b1 = (A3*(a5 + a7)) >> 11; \
|
||||||
const int b2 = MUL(A4, a5) - b0 + b1; \
|
const int b2 = ((A4*a5) >> 11) - b0 + b1; \
|
||||||
const int b3 = MUL(A1, a6 - a4) - b2; \
|
const int b3 = (A1*(a6 - a4) >> 11) - b2; \
|
||||||
const int b4 = MUL(A2, a7) + b3 - b1; \
|
const int b4 = ((A2*a7) >> 11) + b3 - b1; \
|
||||||
(dest)[d0] = munge(a0+a2 +b0); \
|
(dest)[d0] = munge(a0+a2 +b0); \
|
||||||
(dest)[d1] = munge(a1+a3-a2+b2); \
|
(dest)[d1] = munge(a1+a3-a2+b2); \
|
||||||
(dest)[d2] = munge(a1-a3+a2+b3); \
|
(dest)[d2] = munge(a1-a3+a2+b3); \
|
||||||
|
|||||||
@@ -35,8 +35,6 @@
|
|||||||
#include "bintext.h"
|
#include "bintext.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#define FONT_WIDTH 8
|
|
||||||
|
|
||||||
typedef struct XbinContext {
|
typedef struct XbinContext {
|
||||||
AVFrame *frame;
|
AVFrame *frame;
|
||||||
int palette[16];
|
int palette[16];
|
||||||
@@ -63,10 +61,6 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
|||||||
av_log(avctx, AV_LOG_ERROR, "not enough extradata\n");
|
av_log(avctx, AV_LOG_ERROR, "not enough extradata\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
if (!s->font_height) {
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "invalid font height\n");
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
s->font_height = 8;
|
s->font_height = 8;
|
||||||
s->flags = 0;
|
s->flags = 0;
|
||||||
@@ -97,9 +91,6 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (avctx->width < FONT_WIDTH || avctx->height < s->font_height)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
|
|
||||||
s->frame = av_frame_alloc();
|
s->frame = av_frame_alloc();
|
||||||
if (!s->frame)
|
if (!s->frame)
|
||||||
@@ -122,6 +113,8 @@ av_unused static void hscroll(AVCodecContext *avctx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define FONT_WIDTH 8
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw character to screen
|
* Draw character to screen
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -169,9 +169,9 @@ static int build_table(VLC *vlc, int table_nb_bits, int nb_codes,
|
|||||||
uint32_t code;
|
uint32_t code;
|
||||||
volatile VLC_TYPE (* volatile table)[2]; // the double volatile is needed to prevent an internal compiler error in gcc 4.2
|
volatile VLC_TYPE (* volatile table)[2]; // the double volatile is needed to prevent an internal compiler error in gcc 4.2
|
||||||
|
|
||||||
|
table_size = 1 << table_nb_bits;
|
||||||
if (table_nb_bits > 30)
|
if (table_nb_bits > 30)
|
||||||
return -1;
|
return -1;
|
||||||
table_size = 1 << table_nb_bits;
|
|
||||||
table_index = alloc_table(vlc, table_size, flags & INIT_VLC_USE_NEW_STATIC);
|
table_index = alloc_table(vlc, table_size, flags & INIT_VLC_USE_NEW_STATIC);
|
||||||
ff_dlog(NULL, "new table index=%d size=%d\n", table_index, table_size);
|
ff_dlog(NULL, "new table index=%d size=%d\n", table_index, table_size);
|
||||||
if (table_index < 0)
|
if (table_index < 0)
|
||||||
@@ -195,9 +195,8 @@ static int build_table(VLC *vlc, int table_nb_bits, int nb_codes,
|
|||||||
}
|
}
|
||||||
for (k = 0; k < nb; k++) {
|
for (k = 0; k < nb; k++) {
|
||||||
int bits = table[j][1];
|
int bits = table[j][1];
|
||||||
int oldsym = table[j][0];
|
|
||||||
ff_dlog(NULL, "%4x: code=%d n=%d\n", j, i, n);
|
ff_dlog(NULL, "%4x: code=%d n=%d\n", j, i, n);
|
||||||
if ((bits || oldsym) && (bits != n || oldsym != symbol)) {
|
if (bits != 0 && bits != n) {
|
||||||
av_log(NULL, AV_LOG_ERROR, "incorrect codes\n");
|
av_log(NULL, AV_LOG_ERROR, "incorrect codes\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
@@ -234,10 +233,6 @@ static int build_table(VLC *vlc, int table_nb_bits, int nb_codes,
|
|||||||
/* note: realloc has been done, so reload tables */
|
/* note: realloc has been done, so reload tables */
|
||||||
table = (volatile VLC_TYPE (*)[2])&vlc->table[table_index];
|
table = (volatile VLC_TYPE (*)[2])&vlc->table[table_index];
|
||||||
table[j][0] = index; //code
|
table[j][0] = index; //code
|
||||||
if (table[j][0] != index) {
|
|
||||||
avpriv_request_sample(NULL, "strange codes");
|
|
||||||
return AVERROR_PATCHWELCOME;
|
|
||||||
}
|
|
||||||
i = k-1;
|
i = k-1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,9 +58,6 @@ const AVBitStreamFilter *av_bsf_get_by_name(const char *name)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!name)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
for (i = 0; bitstream_filters[i]; i++) {
|
for (i = 0; bitstream_filters[i]; i++) {
|
||||||
const AVBitStreamFilter *f = bitstream_filters[i];
|
const AVBitStreamFilter *f = bitstream_filters[i];
|
||||||
if (!strcmp(f->name, name))
|
if (!strcmp(f->name, name))
|
||||||
|
|||||||
+1
-4
@@ -286,7 +286,7 @@ static int bmp_decode_frame(AVCodecContext *avctx,
|
|||||||
case 1:
|
case 1:
|
||||||
for (i = 0; i < avctx->height; i++) {
|
for (i = 0; i < avctx->height; i++) {
|
||||||
int j;
|
int j;
|
||||||
for (j = 0; j < avctx->width >> 3; j++) {
|
for (j = 0; j < n; j++) {
|
||||||
ptr[j*8+0] = buf[j] >> 7;
|
ptr[j*8+0] = buf[j] >> 7;
|
||||||
ptr[j*8+1] = (buf[j] >> 6) & 1;
|
ptr[j*8+1] = (buf[j] >> 6) & 1;
|
||||||
ptr[j*8+2] = (buf[j] >> 5) & 1;
|
ptr[j*8+2] = (buf[j] >> 5) & 1;
|
||||||
@@ -296,9 +296,6 @@ static int bmp_decode_frame(AVCodecContext *avctx,
|
|||||||
ptr[j*8+6] = (buf[j] >> 1) & 1;
|
ptr[j*8+6] = (buf[j] >> 1) & 1;
|
||||||
ptr[j*8+7] = buf[j] & 1;
|
ptr[j*8+7] = buf[j] & 1;
|
||||||
}
|
}
|
||||||
for (j = 0; j < (avctx->width & 7); j++) {
|
|
||||||
ptr[avctx->width - (avctx->width & 7) + j] = buf[avctx->width >> 3] >> (7 - j) & 1;
|
|
||||||
}
|
|
||||||
buf += n;
|
buf += n;
|
||||||
ptr += linesize;
|
ptr += linesize;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ static int decode_bmv_frame(const uint8_t *source, int src_len, uint8_t *frame,
|
|||||||
if (src < source || src >= source_end)
|
if (src < source || src >= source_end)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
shift += 2;
|
shift += 2;
|
||||||
val |= (unsigned)*src << shift;
|
val |= *src << shift;
|
||||||
if (*src & 0xC)
|
if (*src & 0xC)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -204,10 +204,6 @@ static int pix_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
avpriv_request_sample(avctx, "Format %d", hdr.format);
|
avpriv_request_sample(avctx, "Format %d", hdr.format);
|
||||||
return AVERROR_PATCHWELCOME;
|
return AVERROR_PATCHWELCOME;
|
||||||
}
|
}
|
||||||
bytes_per_scanline = bytes_pp * hdr.width;
|
|
||||||
|
|
||||||
if (bytestream2_get_bytes_left(&gb) < hdr.height * bytes_per_scanline)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
if ((ret = ff_set_dimensions(avctx, hdr.width, hdr.height)) < 0)
|
if ((ret = ff_set_dimensions(avctx, hdr.width, hdr.height)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
@@ -265,6 +261,7 @@ static int pix_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
bytestream2_skip(&gb, 8);
|
bytestream2_skip(&gb, 8);
|
||||||
|
|
||||||
// read the image data to the buffer
|
// read the image data to the buffer
|
||||||
|
bytes_per_scanline = bytes_pp * hdr.width;
|
||||||
bytes_left = bytestream2_get_bytes_left(&gb);
|
bytes_left = bytestream2_get_bytes_left(&gb);
|
||||||
|
|
||||||
if (chunk_type != IMAGE_DATA_CHUNK || data_len != bytes_left ||
|
if (chunk_type != IMAGE_DATA_CHUNK || data_len != bytes_left ||
|
||||||
|
|||||||
+2
-3
@@ -48,8 +48,7 @@ void av_bsf_free(AVBSFContext **pctx)
|
|||||||
|
|
||||||
av_opt_free(ctx);
|
av_opt_free(ctx);
|
||||||
|
|
||||||
if (ctx->internal)
|
av_packet_free(&ctx->internal->buffer_pkt);
|
||||||
av_packet_free(&ctx->internal->buffer_pkt);
|
|
||||||
av_freep(&ctx->internal);
|
av_freep(&ctx->internal);
|
||||||
av_freep(&ctx->priv_data);
|
av_freep(&ctx->priv_data);
|
||||||
|
|
||||||
@@ -404,7 +403,7 @@ void av_bsf_list_free(AVBSFList **lst)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!*lst)
|
if (*lst)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i = 0; i < (*lst)->nb_bsfs; ++i)
|
for (i = 0; i < (*lst)->nb_bsfs; ++i)
|
||||||
|
|||||||
+4
-10
@@ -537,7 +537,8 @@ void ff_cavs_inter(AVSContext *h, enum cavs_mb mb_type)
|
|||||||
static inline void scale_mv(AVSContext *h, int *d_x, int *d_y,
|
static inline void scale_mv(AVSContext *h, int *d_x, int *d_y,
|
||||||
cavs_vector *src, int distp)
|
cavs_vector *src, int distp)
|
||||||
{
|
{
|
||||||
int64_t den = h->scale_den[FFMAX(src->ref, 0)];
|
int den = h->scale_den[FFMAX(src->ref, 0)];
|
||||||
|
|
||||||
*d_x = (src->x * distp * den + 256 + FF_SIGNBIT(src->x)) >> 9;
|
*d_x = (src->x * distp * den + 256 + FF_SIGNBIT(src->x)) >> 9;
|
||||||
*d_y = (src->y * distp * den + 256 + FF_SIGNBIT(src->y)) >> 9;
|
*d_y = (src->y * distp * den + 256 + FF_SIGNBIT(src->y)) >> 9;
|
||||||
}
|
}
|
||||||
@@ -612,15 +613,8 @@ void ff_cavs_mv(AVSContext *h, enum cavs_mv_loc nP, enum cavs_mv_loc nC,
|
|||||||
mv_pred_median(h, mvP, mvA, mvB, mvC);
|
mv_pred_median(h, mvP, mvA, mvB, mvC);
|
||||||
|
|
||||||
if (mode < MV_PRED_PSKIP) {
|
if (mode < MV_PRED_PSKIP) {
|
||||||
int mx = get_se_golomb(&h->gb) + (unsigned)mvP->x;
|
mvP->x += get_se_golomb(&h->gb);
|
||||||
int my = get_se_golomb(&h->gb) + (unsigned)mvP->y;
|
mvP->y += get_se_golomb(&h->gb);
|
||||||
|
|
||||||
if (mx != (int16_t)mx || my != (int16_t)my) {
|
|
||||||
av_log(h->avctx, AV_LOG_ERROR, "MV %d %d out of supported range\n", mx, my);
|
|
||||||
} else {
|
|
||||||
mvP->x = mx;
|
|
||||||
mvP->y = my;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
set_mvs(mvP, size);
|
set_mvs(mvP, size);
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-36
@@ -465,7 +465,7 @@ static inline void mv_pred_direct(AVSContext *h, cavs_vector *pmv_fw,
|
|||||||
cavs_vector *col_mv)
|
cavs_vector *col_mv)
|
||||||
{
|
{
|
||||||
cavs_vector *pmv_bw = pmv_fw + MV_BWD_OFFS;
|
cavs_vector *pmv_bw = pmv_fw + MV_BWD_OFFS;
|
||||||
unsigned den = h->direct_den[col_mv->ref];
|
int den = h->direct_den[col_mv->ref];
|
||||||
int m = FF_SIGNBIT(col_mv->x);
|
int m = FF_SIGNBIT(col_mv->x);
|
||||||
|
|
||||||
pmv_fw->dist = h->dist[1];
|
pmv_fw->dist = h->dist[1];
|
||||||
@@ -591,21 +591,14 @@ static int decode_residual_block(AVSContext *h, GetBitContext *gb,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline int decode_residual_chroma(AVSContext *h)
|
static inline void decode_residual_chroma(AVSContext *h)
|
||||||
{
|
{
|
||||||
if (h->cbp & (1 << 4)) {
|
if (h->cbp & (1 << 4))
|
||||||
int ret = decode_residual_block(h, &h->gb, chroma_dec, 0,
|
decode_residual_block(h, &h->gb, chroma_dec, 0,
|
||||||
ff_cavs_chroma_qp[h->qp], h->cu, h->c_stride);
|
ff_cavs_chroma_qp[h->qp], h->cu, h->c_stride);
|
||||||
if (ret < 0)
|
if (h->cbp & (1 << 5))
|
||||||
return ret;
|
decode_residual_block(h, &h->gb, chroma_dec, 0,
|
||||||
}
|
|
||||||
if (h->cbp & (1 << 5)) {
|
|
||||||
int ret = decode_residual_block(h, &h->gb, chroma_dec, 0,
|
|
||||||
ff_cavs_chroma_qp[h->qp], h->cv, h->c_stride);
|
ff_cavs_chroma_qp[h->qp], h->cv, h->c_stride);
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int decode_residual_inter(AVSContext *h)
|
static inline int decode_residual_inter(AVSContext *h)
|
||||||
@@ -622,7 +615,7 @@ static inline int decode_residual_inter(AVSContext *h)
|
|||||||
|
|
||||||
/* get quantizer */
|
/* get quantizer */
|
||||||
if (h->cbp && !h->qp_fixed)
|
if (h->cbp && !h->qp_fixed)
|
||||||
h->qp = (h->qp + (unsigned)get_se_golomb(&h->gb)) & 63;
|
h->qp = (h->qp + get_se_golomb(&h->gb)) & 63;
|
||||||
for (block = 0; block < 4; block++)
|
for (block = 0; block < 4; block++)
|
||||||
if (h->cbp & (1 << block))
|
if (h->cbp & (1 << block))
|
||||||
decode_residual_block(h, &h->gb, inter_dec, 0, h->qp,
|
decode_residual_block(h, &h->gb, inter_dec, 0, h->qp,
|
||||||
@@ -656,7 +649,6 @@ static int decode_mb_i(AVSContext *h, int cbp_code)
|
|||||||
uint8_t top[18];
|
uint8_t top[18];
|
||||||
uint8_t *left = NULL;
|
uint8_t *left = NULL;
|
||||||
uint8_t *d;
|
uint8_t *d;
|
||||||
int ret;
|
|
||||||
|
|
||||||
ff_cavs_init_mb(h);
|
ff_cavs_init_mb(h);
|
||||||
|
|
||||||
@@ -700,11 +692,8 @@ static int decode_mb_i(AVSContext *h, int cbp_code)
|
|||||||
ff_cavs_load_intra_pred_luma(h, top, &left, block);
|
ff_cavs_load_intra_pred_luma(h, top, &left, block);
|
||||||
h->intra_pred_l[h->pred_mode_Y[scan3x3[block]]]
|
h->intra_pred_l[h->pred_mode_Y[scan3x3[block]]]
|
||||||
(d, top, left, h->l_stride);
|
(d, top, left, h->l_stride);
|
||||||
if (h->cbp & (1<<block)) {
|
if (h->cbp & (1<<block))
|
||||||
ret = decode_residual_block(h, gb, intra_dec, 1, h->qp, d, h->l_stride);
|
decode_residual_block(h, gb, intra_dec, 1, h->qp, d, h->l_stride);
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* chroma intra prediction */
|
/* chroma intra prediction */
|
||||||
@@ -714,9 +703,7 @@ static int decode_mb_i(AVSContext *h, int cbp_code)
|
|||||||
h->intra_pred_c[pred_mode_uv](h->cv, &h->top_border_v[h->mbx * 10],
|
h->intra_pred_c[pred_mode_uv](h->cv, &h->top_border_v[h->mbx * 10],
|
||||||
h->left_border_v, h->c_stride);
|
h->left_border_v, h->c_stride);
|
||||||
|
|
||||||
ret = decode_residual_chroma(h);
|
decode_residual_chroma(h);
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
ff_cavs_filter(h, I_8X8);
|
ff_cavs_filter(h, I_8X8);
|
||||||
set_mv_intra(h);
|
set_mv_intra(h);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1044,10 +1031,6 @@ static int decode_pic(AVSContext *h)
|
|||||||
h->scale_den[1] = h->dist[1] ? 512/h->dist[1] : 0;
|
h->scale_den[1] = h->dist[1] ? 512/h->dist[1] : 0;
|
||||||
if (h->cur.f->pict_type == AV_PICTURE_TYPE_B) {
|
if (h->cur.f->pict_type == AV_PICTURE_TYPE_B) {
|
||||||
h->sym_factor = h->dist[0] * h->scale_den[1];
|
h->sym_factor = h->dist[0] * h->scale_den[1];
|
||||||
if (FFABS(h->sym_factor) > 32768) {
|
|
||||||
av_log(h->avctx, AV_LOG_ERROR, "sym_factor %d too large\n", h->sym_factor);
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
h->direct_den[0] = h->dist[0] ? 16384 / h->dist[0] : 0;
|
h->direct_den[0] = h->dist[0] ? 16384 / h->dist[0] : 0;
|
||||||
h->direct_den[1] = h->dist[1] ? 16384 / h->dist[1] : 0;
|
h->direct_den[1] = h->dist[1] ? 16384 / h->dist[1] : 0;
|
||||||
@@ -1080,11 +1063,6 @@ static int decode_pic(AVSContext *h)
|
|||||||
if (!h->loop_filter_disable && get_bits1(&h->gb)) {
|
if (!h->loop_filter_disable && get_bits1(&h->gb)) {
|
||||||
h->alpha_offset = get_se_golomb(&h->gb);
|
h->alpha_offset = get_se_golomb(&h->gb);
|
||||||
h->beta_offset = get_se_golomb(&h->gb);
|
h->beta_offset = get_se_golomb(&h->gb);
|
||||||
if ( h->alpha_offset < -64 || h->alpha_offset > 64
|
|
||||||
|| h-> beta_offset < -64 || h-> beta_offset > 64) {
|
|
||||||
h->alpha_offset = h->beta_offset = 0;
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
h->alpha_offset = h->beta_offset = 0;
|
h->alpha_offset = h->beta_offset = 0;
|
||||||
}
|
}
|
||||||
@@ -1207,7 +1185,6 @@ static int cavs_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
int input_size, ret;
|
int input_size, ret;
|
||||||
const uint8_t *buf_end;
|
const uint8_t *buf_end;
|
||||||
const uint8_t *buf_ptr;
|
const uint8_t *buf_ptr;
|
||||||
int frame_start = 0;
|
|
||||||
|
|
||||||
if (buf_size == 0) {
|
if (buf_size == 0) {
|
||||||
if (!h->low_delay && h->DPB[0].f->data[0]) {
|
if (!h->low_delay && h->DPB[0].f->data[0]) {
|
||||||
@@ -1241,9 +1218,6 @@ static int cavs_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
h->got_keyframe = 1;
|
h->got_keyframe = 1;
|
||||||
}
|
}
|
||||||
case PIC_PB_START_CODE:
|
case PIC_PB_START_CODE:
|
||||||
if (frame_start > 1)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
frame_start ++;
|
|
||||||
if (*got_frame)
|
if (*got_frame)
|
||||||
av_frame_unref(data);
|
av_frame_unref(data);
|
||||||
*got_frame = 0;
|
*got_frame = 0;
|
||||||
|
|||||||
+24
-24
@@ -192,20 +192,20 @@ static void cavs_idct8_add_c(uint8_t *dst, int16_t *block, int stride) {
|
|||||||
src[0][0] += 8;
|
src[0][0] += 8;
|
||||||
|
|
||||||
for( i = 0; i < 8; i++ ) {
|
for( i = 0; i < 8; i++ ) {
|
||||||
const int a0 = 3 * src[i][1] - 2 * src[i][7];
|
const int a0 = 3*src[i][1] - (src[i][7]<<1);
|
||||||
const int a1 = 3 * src[i][3] + 2 * src[i][5];
|
const int a1 = 3*src[i][3] + (src[i][5]<<1);
|
||||||
const int a2 = 2 * src[i][3] - 3 * src[i][5];
|
const int a2 = (src[i][3]<<1) - 3*src[i][5];
|
||||||
const int a3 = 2 * src[i][1] + 3 * src[i][7];
|
const int a3 = (src[i][1]<<1) + 3*src[i][7];
|
||||||
|
|
||||||
const int b4 = 2 * (a0 + a1 + a3) + a1;
|
const int b4 = ((a0 + a1 + a3)<<1) + a1;
|
||||||
const int b5 = 2 * (a0 - a1 + a2) + a0;
|
const int b5 = ((a0 - a1 + a2)<<1) + a0;
|
||||||
const int b6 = 2 * (a3 - a2 - a1) + a3;
|
const int b6 = ((a3 - a2 - a1)<<1) + a3;
|
||||||
const int b7 = 2 * (a0 - a2 - a3) - a2;
|
const int b7 = ((a0 - a2 - a3)<<1) - a2;
|
||||||
|
|
||||||
const int a7 = 4 * src[i][2] - 10 * src[i][6];
|
const int a7 = (src[i][2]<<2) - 10*src[i][6];
|
||||||
const int a6 = 4 * src[i][6] + 10 * src[i][2];
|
const int a6 = (src[i][6]<<2) + 10*src[i][2];
|
||||||
const int a5 = 8 * (src[i][0] - src[i][4]) + 4;
|
const int a5 = ((src[i][0] - src[i][4]) << 3) + 4;
|
||||||
const int a4 = 8 * (src[i][0] + src[i][4]) + 4;
|
const int a4 = ((src[i][0] + src[i][4]) << 3) + 4;
|
||||||
|
|
||||||
const int b0 = a4 + a6;
|
const int b0 = a4 + a6;
|
||||||
const int b1 = a5 + a7;
|
const int b1 = a5 + a7;
|
||||||
@@ -222,20 +222,20 @@ static void cavs_idct8_add_c(uint8_t *dst, int16_t *block, int stride) {
|
|||||||
src[i][7] = (b0 - b4) >> 3;
|
src[i][7] = (b0 - b4) >> 3;
|
||||||
}
|
}
|
||||||
for( i = 0; i < 8; i++ ) {
|
for( i = 0; i < 8; i++ ) {
|
||||||
const int a0 = 3 * src[1][i] - 2 * src[7][i];
|
const int a0 = 3*src[1][i] - (src[7][i]<<1);
|
||||||
const int a1 = 3 * src[3][i] + 2 * src[5][i];
|
const int a1 = 3*src[3][i] + (src[5][i]<<1);
|
||||||
const int a2 = 2 * src[3][i] - 3 * src[5][i];
|
const int a2 = (src[3][i]<<1) - 3*src[5][i];
|
||||||
const int a3 = 2 * src[1][i] + 3 * src[7][i];
|
const int a3 = (src[1][i]<<1) + 3*src[7][i];
|
||||||
|
|
||||||
const int b4 = 2 * (a0 + a1 + a3) + a1;
|
const int b4 = ((a0 + a1 + a3)<<1) + a1;
|
||||||
const int b5 = 2 * (a0 - a1 + a2) + a0;
|
const int b5 = ((a0 - a1 + a2)<<1) + a0;
|
||||||
const int b6 = 2 * (a3 - a2 - a1) + a3;
|
const int b6 = ((a3 - a2 - a1)<<1) + a3;
|
||||||
const int b7 = 2 * (a0 - a2 - a3) - a2;
|
const int b7 = ((a0 - a2 - a3)<<1) - a2;
|
||||||
|
|
||||||
const int a7 = 4 * src[2][i] - 10 * src[6][i];
|
const int a7 = (src[2][i]<<2) - 10*src[6][i];
|
||||||
const int a6 = 4 * src[6][i] + 10 * src[2][i];
|
const int a6 = (src[6][i]<<2) + 10*src[2][i];
|
||||||
const int a5 = 8 * (src[0][i] - src[4][i]);
|
const int a5 = (src[0][i] - src[4][i]) << 3;
|
||||||
const int a4 = 8 * (src[0][i] + src[4][i]);
|
const int a4 = (src[0][i] + src[4][i]) << 3;
|
||||||
|
|
||||||
const int b0 = a4 + a6;
|
const int b0 = a4 + a6;
|
||||||
const int b1 = a5 + a7;
|
const int b1 = a5 + a7;
|
||||||
|
|||||||
@@ -212,10 +212,10 @@ static const unsigned char pac2_attribs[32][3] = // Color, font, ident
|
|||||||
|
|
||||||
struct Screen {
|
struct Screen {
|
||||||
/* +1 is used to compensate null character of string */
|
/* +1 is used to compensate null character of string */
|
||||||
uint8_t characters[SCREEN_ROWS+1][SCREEN_COLUMNS+1];
|
uint8_t characters[SCREEN_ROWS][SCREEN_COLUMNS+1];
|
||||||
uint8_t charsets[SCREEN_ROWS+1][SCREEN_COLUMNS+1];
|
uint8_t charsets[SCREEN_ROWS][SCREEN_COLUMNS+1];
|
||||||
uint8_t colors[SCREEN_ROWS+1][SCREEN_COLUMNS+1];
|
uint8_t colors[SCREEN_ROWS][SCREEN_COLUMNS+1];
|
||||||
uint8_t fonts[SCREEN_ROWS+1][SCREEN_COLUMNS+1];
|
uint8_t fonts[SCREEN_ROWS][SCREEN_COLUMNS+1];
|
||||||
/*
|
/*
|
||||||
* Bitmask of used rows; if a bit is not set, the
|
* Bitmask of used rows; if a bit is not set, the
|
||||||
* corresponding row is not used.
|
* corresponding row is not used.
|
||||||
|
|||||||
@@ -80,8 +80,11 @@ static av_cold int cdg_decode_init(AVCodecContext *avctx)
|
|||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
cc->transparency = -1;
|
cc->transparency = -1;
|
||||||
|
|
||||||
|
avctx->width = CDG_FULL_WIDTH;
|
||||||
|
avctx->height = CDG_FULL_HEIGHT;
|
||||||
avctx->pix_fmt = AV_PIX_FMT_PAL8;
|
avctx->pix_fmt = AV_PIX_FMT_PAL8;
|
||||||
return ff_set_dimensions(avctx, CDG_FULL_WIDTH, CDG_FULL_HEIGHT);
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cdg_border_preset(CDGraphicsContext *cc, uint8_t *data)
|
static void cdg_border_preset(CDGraphicsContext *cc, uint8_t *data)
|
||||||
@@ -238,7 +241,7 @@ static void cdg_scroll(CDGraphicsContext *cc, uint8_t *data,
|
|||||||
for (y = FFMAX(0, vinc); y < FFMIN(CDG_FULL_HEIGHT + vinc, CDG_FULL_HEIGHT); y++)
|
for (y = FFMAX(0, vinc); y < FFMIN(CDG_FULL_HEIGHT + vinc, CDG_FULL_HEIGHT); y++)
|
||||||
memcpy(out + FFMAX(0, hinc) + stride * y,
|
memcpy(out + FFMAX(0, hinc) + stride * y,
|
||||||
in + FFMAX(0, hinc) - hinc + (y - vinc) * stride,
|
in + FFMAX(0, hinc) - hinc + (y - vinc) * stride,
|
||||||
FFABS(stride) - FFABS(hinc));
|
FFMIN(stride + hinc, stride));
|
||||||
|
|
||||||
if (vinc > 0)
|
if (vinc > 0)
|
||||||
cdg_fill_wrapper(0, 0, out,
|
cdg_fill_wrapper(0, 0, out,
|
||||||
|
|||||||
+3
-3
@@ -275,11 +275,11 @@ static int cdxl_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
else
|
else
|
||||||
aligned_width = FFALIGN(c->avctx->width, 16);
|
aligned_width = FFALIGN(c->avctx->width, 16);
|
||||||
c->padded_bits = aligned_width - c->avctx->width;
|
c->padded_bits = aligned_width - c->avctx->width;
|
||||||
if (c->video_size < aligned_width * avctx->height * (int64_t)c->bpp / 8)
|
if (c->video_size < aligned_width * avctx->height * c->bpp / 8)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
if (!encoding && c->palette_size && c->bpp <= 8 && c->format != CHUNKY) {
|
if (!encoding && c->palette_size && c->bpp <= 8) {
|
||||||
avctx->pix_fmt = AV_PIX_FMT_PAL8;
|
avctx->pix_fmt = AV_PIX_FMT_PAL8;
|
||||||
} else if (encoding == 1 && (c->bpp == 6 || c->bpp == 8) && c->format != CHUNKY) {
|
} else if (encoding == 1 && (c->bpp == 6 || c->bpp == 8)) {
|
||||||
if (c->palette_size != (1 << (c->bpp - 1)))
|
if (c->palette_size != (1 << (c->bpp - 1)))
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
avctx->pix_fmt = AV_PIX_FMT_BGR24;
|
avctx->pix_fmt = AV_PIX_FMT_BGR24;
|
||||||
|
|||||||
+16
-26
@@ -258,11 +258,6 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
s->coded_height = data;
|
s->coded_height = data;
|
||||||
} else if (tag == 101) {
|
} else if (tag == 101) {
|
||||||
av_log(avctx, AV_LOG_DEBUG, "Bits per component: %"PRIu16"\n", data);
|
av_log(avctx, AV_LOG_DEBUG, "Bits per component: %"PRIu16"\n", data);
|
||||||
if (data < 1 || data > 31) {
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "Bits per component %d is invalid\n", data);
|
|
||||||
ret = AVERROR(EINVAL);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
s->bpc = data;
|
s->bpc = data;
|
||||||
} else if (tag == 12) {
|
} else if (tag == 12) {
|
||||||
av_log(avctx, AV_LOG_DEBUG, "Channel Count: %"PRIu16"\n", data);
|
av_log(avctx, AV_LOG_DEBUG, "Channel Count: %"PRIu16"\n", data);
|
||||||
@@ -322,22 +317,22 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
s->prescale_shift[2] = (data >> 6) & 0x7;
|
s->prescale_shift[2] = (data >> 6) & 0x7;
|
||||||
av_log(avctx, AV_LOG_DEBUG, "Prescale shift (VC-5): %x\n", data);
|
av_log(avctx, AV_LOG_DEBUG, "Prescale shift (VC-5): %x\n", data);
|
||||||
} else if (tag == 27) {
|
} else if (tag == 27) {
|
||||||
|
s->plane[s->channel_num].band[0][0].width = data;
|
||||||
|
s->plane[s->channel_num].band[0][0].stride = data;
|
||||||
av_log(avctx, AV_LOG_DEBUG, "Lowpass width %"PRIu16"\n", data);
|
av_log(avctx, AV_LOG_DEBUG, "Lowpass width %"PRIu16"\n", data);
|
||||||
if (data < 3 || data > s->plane[s->channel_num].band[0][0].a_width) {
|
if (data < 3 || data > s->plane[s->channel_num].band[0][0].a_width) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Invalid lowpass width\n");
|
av_log(avctx, AV_LOG_ERROR, "Invalid lowpass width\n");
|
||||||
ret = AVERROR(EINVAL);
|
ret = AVERROR(EINVAL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
s->plane[s->channel_num].band[0][0].width = data;
|
|
||||||
s->plane[s->channel_num].band[0][0].stride = data;
|
|
||||||
} else if (tag == 28) {
|
} else if (tag == 28) {
|
||||||
|
s->plane[s->channel_num].band[0][0].height = data;
|
||||||
av_log(avctx, AV_LOG_DEBUG, "Lowpass height %"PRIu16"\n", data);
|
av_log(avctx, AV_LOG_DEBUG, "Lowpass height %"PRIu16"\n", data);
|
||||||
if (data < 3 || data > s->plane[s->channel_num].band[0][0].a_height) {
|
if (data < 3 || data > s->plane[s->channel_num].band[0][0].height) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Invalid lowpass height\n");
|
av_log(avctx, AV_LOG_ERROR, "Invalid lowpass height\n");
|
||||||
ret = AVERROR(EINVAL);
|
ret = AVERROR(EINVAL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
s->plane[s->channel_num].band[0][0].height = data;
|
|
||||||
} else if (tag == 1)
|
} else if (tag == 1)
|
||||||
av_log(avctx, AV_LOG_DEBUG, "Sample type? %"PRIu16"\n", data);
|
av_log(avctx, AV_LOG_DEBUG, "Sample type? %"PRIu16"\n", data);
|
||||||
else if (tag == 10) {
|
else if (tag == 10) {
|
||||||
@@ -345,10 +340,6 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
avpriv_report_missing_feature(avctx, "Transform type of %"PRIu16, data);
|
avpriv_report_missing_feature(avctx, "Transform type of %"PRIu16, data);
|
||||||
ret = AVERROR_PATCHWELCOME;
|
ret = AVERROR_PATCHWELCOME;
|
||||||
break;
|
break;
|
||||||
} else if (data == 1) {
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "unsupported transform type\n");
|
|
||||||
ret = AVERROR_PATCHWELCOME;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
av_log(avctx, AV_LOG_DEBUG, "Transform-type? %"PRIu16"\n", data);
|
av_log(avctx, AV_LOG_DEBUG, "Transform-type? %"PRIu16"\n", data);
|
||||||
} else if (abstag >= 0x4000 && abstag <= 0x40ff) {
|
} else if (abstag >= 0x4000 && abstag <= 0x40ff) {
|
||||||
@@ -372,39 +363,39 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
av_log(avctx, AV_LOG_DEBUG, "Tag/Value = %x %x\n", tag2, val2);
|
av_log(avctx, AV_LOG_DEBUG, "Tag/Value = %x %x\n", tag2, val2);
|
||||||
}
|
}
|
||||||
} else if (tag == 41) {
|
} else if (tag == 41) {
|
||||||
|
s->plane[s->channel_num].band[s->level][s->subband_num].width = data;
|
||||||
|
s->plane[s->channel_num].band[s->level][s->subband_num].stride = FFALIGN(data, 8);
|
||||||
av_log(avctx, AV_LOG_DEBUG, "Highpass width %i channel %i level %i subband %i\n", data, s->channel_num, s->level, s->subband_num);
|
av_log(avctx, AV_LOG_DEBUG, "Highpass width %i channel %i level %i subband %i\n", data, s->channel_num, s->level, s->subband_num);
|
||||||
if (data < 3) {
|
if (data < 3) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Invalid highpass width\n");
|
av_log(avctx, AV_LOG_ERROR, "Invalid highpass width\n");
|
||||||
ret = AVERROR(EINVAL);
|
ret = AVERROR(EINVAL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
s->plane[s->channel_num].band[s->level][s->subband_num].width = data;
|
|
||||||
s->plane[s->channel_num].band[s->level][s->subband_num].stride = FFALIGN(data, 8);
|
|
||||||
} else if (tag == 42) {
|
} else if (tag == 42) {
|
||||||
|
s->plane[s->channel_num].band[s->level][s->subband_num].height = data;
|
||||||
av_log(avctx, AV_LOG_DEBUG, "Highpass height %i\n", data);
|
av_log(avctx, AV_LOG_DEBUG, "Highpass height %i\n", data);
|
||||||
if (data < 3) {
|
if (data < 3) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Invalid highpass height\n");
|
av_log(avctx, AV_LOG_ERROR, "Invalid highpass height\n");
|
||||||
ret = AVERROR(EINVAL);
|
ret = AVERROR(EINVAL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
s->plane[s->channel_num].band[s->level][s->subband_num].height = data;
|
|
||||||
} else if (tag == 49) {
|
} else if (tag == 49) {
|
||||||
|
s->plane[s->channel_num].band[s->level][s->subband_num].width = data;
|
||||||
|
s->plane[s->channel_num].band[s->level][s->subband_num].stride = FFALIGN(data, 8);
|
||||||
av_log(avctx, AV_LOG_DEBUG, "Highpass width2 %i\n", data);
|
av_log(avctx, AV_LOG_DEBUG, "Highpass width2 %i\n", data);
|
||||||
if (data < 3) {
|
if (data < 3) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Invalid highpass width2\n");
|
av_log(avctx, AV_LOG_ERROR, "Invalid highpass width2\n");
|
||||||
ret = AVERROR(EINVAL);
|
ret = AVERROR(EINVAL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
s->plane[s->channel_num].band[s->level][s->subband_num].width = data;
|
|
||||||
s->plane[s->channel_num].band[s->level][s->subband_num].stride = FFALIGN(data, 8);
|
|
||||||
} else if (tag == 50) {
|
} else if (tag == 50) {
|
||||||
|
s->plane[s->channel_num].band[s->level][s->subband_num].height = data;
|
||||||
av_log(avctx, AV_LOG_DEBUG, "Highpass height2 %i\n", data);
|
av_log(avctx, AV_LOG_DEBUG, "Highpass height2 %i\n", data);
|
||||||
if (data < 3) {
|
if (data < 3) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Invalid highpass height2\n");
|
av_log(avctx, AV_LOG_ERROR, "Invalid highpass height2\n");
|
||||||
ret = AVERROR(EINVAL);
|
ret = AVERROR(EINVAL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
s->plane[s->channel_num].band[s->level][s->subband_num].height = data;
|
|
||||||
} else if (tag == 71) {
|
} else if (tag == 71) {
|
||||||
s->codebook = data;
|
s->codebook = data;
|
||||||
av_log(avctx, AV_LOG_DEBUG, "Codebook %i\n", s->codebook);
|
av_log(avctx, AV_LOG_DEBUG, "Codebook %i\n", s->codebook);
|
||||||
@@ -413,12 +404,12 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
av_log(avctx, AV_LOG_DEBUG, "Other codebook? %i\n", s->codebook);
|
av_log(avctx, AV_LOG_DEBUG, "Other codebook? %i\n", s->codebook);
|
||||||
} else if (tag == 70) {
|
} else if (tag == 70) {
|
||||||
av_log(avctx, AV_LOG_DEBUG, "Subsampling or bit-depth flag? %i\n", data);
|
av_log(avctx, AV_LOG_DEBUG, "Subsampling or bit-depth flag? %i\n", data);
|
||||||
if (!(data == 10 || data == 12)) {
|
s->bpc = data;
|
||||||
|
if (!(s->bpc == 10 || s->bpc == 12)) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Invalid bits per channel\n");
|
av_log(avctx, AV_LOG_ERROR, "Invalid bits per channel\n");
|
||||||
ret = AVERROR(EINVAL);
|
ret = AVERROR(EINVAL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
s->bpc = data;
|
|
||||||
} else if (tag == 84) {
|
} else if (tag == 84) {
|
||||||
av_log(avctx, AV_LOG_DEBUG, "Sample format? %i\n", data);
|
av_log(avctx, AV_LOG_DEBUG, "Sample format? %i\n", data);
|
||||||
if (data == 1)
|
if (data == 1)
|
||||||
@@ -510,7 +501,7 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
int highpass_a_width = s->plane[s->channel_num].band[s->level][s->subband_num].a_width;
|
int highpass_a_width = s->plane[s->channel_num].band[s->level][s->subband_num].a_width;
|
||||||
int highpass_a_height = s->plane[s->channel_num].band[s->level][s->subband_num].a_height;
|
int highpass_a_height = s->plane[s->channel_num].band[s->level][s->subband_num].a_height;
|
||||||
int highpass_stride = s->plane[s->channel_num].band[s->level][s->subband_num].stride;
|
int highpass_stride = s->plane[s->channel_num].band[s->level][s->subband_num].stride;
|
||||||
int expected;
|
int expected = highpass_height * highpass_stride;
|
||||||
int a_expected = highpass_a_height * highpass_a_width;
|
int a_expected = highpass_a_height * highpass_a_width;
|
||||||
int level, run, coeff;
|
int level, run, coeff;
|
||||||
int count = 0, bytes;
|
int count = 0, bytes;
|
||||||
@@ -521,12 +512,11 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (highpass_height > highpass_a_height || highpass_width > highpass_a_width || a_expected < highpass_height * (uint64_t)highpass_stride) {
|
if (highpass_height > highpass_a_height || highpass_width > highpass_a_width || a_expected < expected) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Too many highpass coefficients\n");
|
av_log(avctx, AV_LOG_ERROR, "Too many highpass coefficients\n");
|
||||||
ret = AVERROR(EINVAL);
|
ret = AVERROR(EINVAL);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
expected = highpass_height * highpass_stride;
|
|
||||||
|
|
||||||
av_log(avctx, AV_LOG_DEBUG, "Start subband coeffs plane %i level %i codebook %i expected %i\n", s->channel_num, s->level, s->codebook, expected);
|
av_log(avctx, AV_LOG_DEBUG, "Start subband coeffs plane %i level %i codebook %i expected %i\n", s->channel_num, s->level, s->codebook, expected);
|
||||||
|
|
||||||
@@ -667,7 +657,7 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
output = s->plane[plane].subband[0];
|
output = s->plane[plane].subband[0];
|
||||||
for (i = 0; i < lowpass_height * 2; i++) {
|
for (i = 0; i < lowpass_height * 2; i++) {
|
||||||
for (j = 0; j < lowpass_width * 2; j++)
|
for (j = 0; j < lowpass_width * 2; j++)
|
||||||
output[j] *= 4;
|
output[j] <<= 2;
|
||||||
|
|
||||||
output += lowpass_width * 2;
|
output += lowpass_width * 2;
|
||||||
}
|
}
|
||||||
@@ -720,7 +710,7 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
output = s->plane[plane].subband[0];
|
output = s->plane[plane].subband[0];
|
||||||
for (i = 0; i < lowpass_height * 2; i++) {
|
for (i = 0; i < lowpass_height * 2; i++) {
|
||||||
for (j = 0; j < lowpass_width * 2; j++)
|
for (j = 0; j < lowpass_width * 2; j++)
|
||||||
output[j] *= 4;
|
output[j] <<= 2;
|
||||||
|
|
||||||
output += lowpass_width * 2;
|
output += lowpass_width * 2;
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-37
@@ -315,11 +315,17 @@ static int cinepak_decode_strip (CinepakContext *s,
|
|||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cinepak_predecode_check (CinepakContext *s)
|
static int cinepak_decode (CinepakContext *s)
|
||||||
{
|
{
|
||||||
int num_strips;
|
const uint8_t *eod = (s->data + s->size);
|
||||||
|
int i, result, strip_size, frame_flags, num_strips;
|
||||||
|
int y0 = 0;
|
||||||
int encoded_buf_size;
|
int encoded_buf_size;
|
||||||
|
|
||||||
|
if (s->size < 10)
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
|
||||||
|
frame_flags = s->data[0];
|
||||||
num_strips = AV_RB16 (&s->data[8]);
|
num_strips = AV_RB16 (&s->data[8]);
|
||||||
encoded_buf_size = AV_RB24(&s->data[1]);
|
encoded_buf_size = AV_RB24(&s->data[1]);
|
||||||
|
|
||||||
@@ -350,21 +356,6 @@ static int cinepak_predecode_check (CinepakContext *s)
|
|||||||
s->sega_film_skip_bytes = 0;
|
s->sega_film_skip_bytes = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->size < 10 + s->sega_film_skip_bytes + num_strips * 12)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int cinepak_decode (CinepakContext *s)
|
|
||||||
{
|
|
||||||
const uint8_t *eod = (s->data + s->size);
|
|
||||||
int i, result, strip_size, frame_flags, num_strips;
|
|
||||||
int y0 = 0;
|
|
||||||
|
|
||||||
frame_flags = s->data[0];
|
|
||||||
num_strips = AV_RB16 (&s->data[8]);
|
|
||||||
|
|
||||||
s->data += 10 + s->sega_film_skip_bytes;
|
s->data += 10 + s->sega_film_skip_bytes;
|
||||||
|
|
||||||
num_strips = FFMIN(num_strips, MAX_STRIPS);
|
num_strips = FFMIN(num_strips, MAX_STRIPS);
|
||||||
@@ -444,36 +435,18 @@ static int cinepak_decode_frame(AVCodecContext *avctx,
|
|||||||
const uint8_t *buf = avpkt->data;
|
const uint8_t *buf = avpkt->data;
|
||||||
int ret = 0, buf_size = avpkt->size;
|
int ret = 0, buf_size = avpkt->size;
|
||||||
CinepakContext *s = avctx->priv_data;
|
CinepakContext *s = avctx->priv_data;
|
||||||
int num_strips;
|
|
||||||
|
|
||||||
s->data = buf;
|
s->data = buf;
|
||||||
s->size = buf_size;
|
s->size = buf_size;
|
||||||
|
|
||||||
if (s->size < 10)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
num_strips = AV_RB16 (&s->data[8]);
|
|
||||||
|
|
||||||
//Empty frame, do not waste time
|
|
||||||
if (!num_strips && (!s->palette_video || !av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, NULL)))
|
|
||||||
return buf_size;
|
|
||||||
|
|
||||||
if ((ret = cinepak_predecode_check(s)) < 0) {
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "cinepak_predecode_check failed\n");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
|
if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (s->palette_video) {
|
if (s->palette_video) {
|
||||||
int size;
|
const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, NULL);
|
||||||
const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, &size);
|
if (pal) {
|
||||||
if (pal && size == AVPALETTE_SIZE) {
|
|
||||||
s->frame->palette_has_changed = 1;
|
s->frame->palette_has_changed = 1;
|
||||||
memcpy(s->pal, pal, AVPALETTE_SIZE);
|
memcpy(s->pal, pal, AVPALETTE_SIZE);
|
||||||
} else if (pal) {
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "Palette size %d is wrong\n", size);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+7
-22
@@ -29,10 +29,6 @@
|
|||||||
#include "avcodec.h"
|
#include "avcodec.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#define VLC_BITS 7
|
|
||||||
#define VLC_DEPTH 2
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct CLLCContext {
|
typedef struct CLLCContext {
|
||||||
AVCodecContext *avctx;
|
AVCodecContext *avctx;
|
||||||
BswapDSPContext bdsp;
|
BswapDSPContext bdsp;
|
||||||
@@ -55,13 +51,6 @@ static int read_code_table(CLLCContext *ctx, GetBitContext *gb, VLC *vlc)
|
|||||||
|
|
||||||
num_lens = get_bits(gb, 5);
|
num_lens = get_bits(gb, 5);
|
||||||
|
|
||||||
if (num_lens > VLC_BITS * VLC_DEPTH) {
|
|
||||||
vlc->table = NULL;
|
|
||||||
|
|
||||||
av_log(ctx->avctx, AV_LOG_ERROR, "To long VLCs %d\n", num_lens);
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < num_lens; i++) {
|
for (i = 0; i < num_lens; i++) {
|
||||||
num_codes = get_bits(gb, 9);
|
num_codes = get_bits(gb, 9);
|
||||||
num_codes_sum += num_codes;
|
num_codes_sum += num_codes;
|
||||||
@@ -81,15 +70,11 @@ static int read_code_table(CLLCContext *ctx, GetBitContext *gb, VLC *vlc)
|
|||||||
|
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
if (prefix > (65535 - 256)/2) {
|
|
||||||
vlc->table = NULL;
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
|
|
||||||
prefix <<= 1;
|
prefix <<= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ff_init_vlc_sparse(vlc, VLC_BITS, count, bits, 1, 1,
|
return ff_init_vlc_sparse(vlc, 7, count, bits, 1, 1,
|
||||||
codes, 2, 2, symbols, 1, 1, 0);
|
codes, 2, 2, symbols, 1, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,7 +101,7 @@ static int read_argb_line(CLLCContext *ctx, GetBitContext *gb, int *top_left,
|
|||||||
for (i = 0; i < ctx->avctx->width; i++) {
|
for (i = 0; i < ctx->avctx->width; i++) {
|
||||||
/* Always get the alpha component */
|
/* Always get the alpha component */
|
||||||
UPDATE_CACHE(bits, gb);
|
UPDATE_CACHE(bits, gb);
|
||||||
GET_VLC(code, bits, gb, vlc[0].table, VLC_BITS, VLC_DEPTH);
|
GET_VLC(code, bits, gb, vlc[0].table, 7, 2);
|
||||||
|
|
||||||
pred[0] += code;
|
pred[0] += code;
|
||||||
dst[0] = pred[0];
|
dst[0] = pred[0];
|
||||||
@@ -125,21 +110,21 @@ static int read_argb_line(CLLCContext *ctx, GetBitContext *gb, int *top_left,
|
|||||||
if (dst[0]) {
|
if (dst[0]) {
|
||||||
/* Red */
|
/* Red */
|
||||||
UPDATE_CACHE(bits, gb);
|
UPDATE_CACHE(bits, gb);
|
||||||
GET_VLC(code, bits, gb, vlc[1].table, VLC_BITS, VLC_DEPTH);
|
GET_VLC(code, bits, gb, vlc[1].table, 7, 2);
|
||||||
|
|
||||||
pred[1] += code;
|
pred[1] += code;
|
||||||
dst[1] = pred[1];
|
dst[1] = pred[1];
|
||||||
|
|
||||||
/* Green */
|
/* Green */
|
||||||
UPDATE_CACHE(bits, gb);
|
UPDATE_CACHE(bits, gb);
|
||||||
GET_VLC(code, bits, gb, vlc[2].table, VLC_BITS, VLC_DEPTH);
|
GET_VLC(code, bits, gb, vlc[2].table, 7, 2);
|
||||||
|
|
||||||
pred[2] += code;
|
pred[2] += code;
|
||||||
dst[2] = pred[2];
|
dst[2] = pred[2];
|
||||||
|
|
||||||
/* Blue */
|
/* Blue */
|
||||||
UPDATE_CACHE(bits, gb);
|
UPDATE_CACHE(bits, gb);
|
||||||
GET_VLC(code, bits, gb, vlc[3].table, VLC_BITS, VLC_DEPTH);
|
GET_VLC(code, bits, gb, vlc[3].table, 7, 2);
|
||||||
|
|
||||||
pred[3] += code;
|
pred[3] += code;
|
||||||
dst[3] = pred[3];
|
dst[3] = pred[3];
|
||||||
@@ -181,7 +166,7 @@ static int read_rgb24_component_line(CLLCContext *ctx, GetBitContext *gb,
|
|||||||
/* Simultaneously read and restore the line */
|
/* Simultaneously read and restore the line */
|
||||||
for (i = 0; i < ctx->avctx->width; i++) {
|
for (i = 0; i < ctx->avctx->width; i++) {
|
||||||
UPDATE_CACHE(bits, gb);
|
UPDATE_CACHE(bits, gb);
|
||||||
GET_VLC(code, bits, gb, vlc->table, VLC_BITS, VLC_DEPTH);
|
GET_VLC(code, bits, gb, vlc->table, 7, 2);
|
||||||
|
|
||||||
pred += code;
|
pred += code;
|
||||||
dst[0] = pred;
|
dst[0] = pred;
|
||||||
@@ -210,7 +195,7 @@ static int read_yuv_component_line(CLLCContext *ctx, GetBitContext *gb,
|
|||||||
/* Simultaneously read and restore the line */
|
/* Simultaneously read and restore the line */
|
||||||
for (i = 0; i < ctx->avctx->width >> is_chroma; i++) {
|
for (i = 0; i < ctx->avctx->width >> is_chroma; i++) {
|
||||||
UPDATE_CACHE(bits, gb);
|
UPDATE_CACHE(bits, gb);
|
||||||
GET_VLC(code, bits, gb, vlc->table, VLC_BITS, VLC_DEPTH);
|
GET_VLC(code, bits, gb, vlc->table, 7, 2);
|
||||||
|
|
||||||
pred += code;
|
pred += code;
|
||||||
outbuf[i] = pred;
|
outbuf[i] = pred;
|
||||||
|
|||||||
+2
-2
@@ -147,7 +147,7 @@ static int cng_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
return ret;
|
return ret;
|
||||||
buf_out = (int16_t *)frame->data[0];
|
buf_out = (int16_t *)frame->data[0];
|
||||||
for (i = 0; i < avctx->frame_size; i++)
|
for (i = 0; i < avctx->frame_size; i++)
|
||||||
buf_out[i] = av_clip_int16(p->filter_out[i + p->order]);
|
buf_out[i] = p->filter_out[i + p->order];
|
||||||
memcpy(p->filter_out, p->filter_out + avctx->frame_size,
|
memcpy(p->filter_out, p->filter_out + avctx->frame_size,
|
||||||
p->order * sizeof(*p->filter_out));
|
p->order * sizeof(*p->filter_out));
|
||||||
|
|
||||||
@@ -168,5 +168,5 @@ AVCodec ff_comfortnoise_decoder = {
|
|||||||
.close = cng_decode_close,
|
.close = cng_decode_close,
|
||||||
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
|
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
|
||||||
AV_SAMPLE_FMT_NONE },
|
AV_SAMPLE_FMT_NONE },
|
||||||
.capabilities = AV_CODEC_CAP_DR1,
|
.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1,
|
||||||
};
|
};
|
||||||
|
|||||||
+21
-21
@@ -143,7 +143,7 @@ typedef struct cook {
|
|||||||
|
|
||||||
/* generate tables and related variables */
|
/* generate tables and related variables */
|
||||||
int gain_size_factor;
|
int gain_size_factor;
|
||||||
float gain_table[31];
|
float gain_table[23];
|
||||||
|
|
||||||
/* data buffers */
|
/* data buffers */
|
||||||
|
|
||||||
@@ -185,8 +185,8 @@ static av_cold void init_gain_table(COOKContext *q)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
q->gain_size_factor = q->samples_per_channel / 8;
|
q->gain_size_factor = q->samples_per_channel / 8;
|
||||||
for (i = 0; i < 31; i++)
|
for (i = 0; i < 23; i++)
|
||||||
q->gain_table[i] = pow(pow2tab[i + 48],
|
q->gain_table[i] = pow(pow2tab[i + 52],
|
||||||
(1.0 / (double) q->gain_size_factor));
|
(1.0 / (double) q->gain_size_factor));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -670,7 +670,7 @@ static void interpolate_float(COOKContext *q, float *buffer,
|
|||||||
for (i = 0; i < q->gain_size_factor; i++)
|
for (i = 0; i < q->gain_size_factor; i++)
|
||||||
buffer[i] *= fc1;
|
buffer[i] *= fc1;
|
||||||
} else { // smooth gain
|
} else { // smooth gain
|
||||||
fc2 = q->gain_table[15 + (gain_index_next - gain_index)];
|
fc2 = q->gain_table[11 + (gain_index_next - gain_index)];
|
||||||
for (i = 0; i < q->gain_size_factor; i++) {
|
for (i = 0; i < q->gain_size_factor; i++) {
|
||||||
buffer[i] *= fc1;
|
buffer[i] *= fc1;
|
||||||
fc1 *= fc2;
|
fc1 *= fc2;
|
||||||
@@ -759,7 +759,7 @@ static int decouple_info(COOKContext *q, COOKSubpacket *p, int *decouple_tab)
|
|||||||
for (i = 0; i < length; i++)
|
for (i = 0; i < length; i++)
|
||||||
decouple_tab[start + i] = get_vlc2(&q->gb,
|
decouple_tab[start + i] = get_vlc2(&q->gb,
|
||||||
p->channel_coupling.table,
|
p->channel_coupling.table,
|
||||||
p->channel_coupling.bits, 3);
|
p->channel_coupling.bits, 2);
|
||||||
else
|
else
|
||||||
for (i = 0; i < length; i++) {
|
for (i = 0; i < length; i++) {
|
||||||
int v = get_bits(&q->gb, p->js_vlc_bits);
|
int v = get_bits(&q->gb, p->js_vlc_bits);
|
||||||
@@ -1075,19 +1075,12 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
|
|||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (avctx->block_align >= INT_MAX / 8)
|
|
||||||
return AVERROR(EINVAL);
|
|
||||||
|
|
||||||
/* Initialize RNG. */
|
/* Initialize RNG. */
|
||||||
av_lfg_init(&q->random_state, 0);
|
av_lfg_init(&q->random_state, 0);
|
||||||
|
|
||||||
ff_audiodsp_init(&q->adsp);
|
ff_audiodsp_init(&q->adsp);
|
||||||
|
|
||||||
while (edata_ptr < edata_ptr_end) {
|
while (edata_ptr < edata_ptr_end) {
|
||||||
if (s >= FFMIN(MAX_SUBPACKETS, avctx->block_align)) {
|
|
||||||
avpriv_request_sample(avctx, "subpackets > %d", FFMIN(MAX_SUBPACKETS, avctx->block_align));
|
|
||||||
return AVERROR_PATCHWELCOME;
|
|
||||||
}
|
|
||||||
/* 8 for mono, 16 for stereo, ? for multichannel
|
/* 8 for mono, 16 for stereo, ? for multichannel
|
||||||
Swap to right endianness so we don't need to care later on. */
|
Swap to right endianness so we don't need to care later on. */
|
||||||
if (extradata_size >= 8) {
|
if (extradata_size >= 8) {
|
||||||
@@ -1227,16 +1220,11 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
|
|||||||
|
|
||||||
q->num_subpackets++;
|
q->num_subpackets++;
|
||||||
s++;
|
s++;
|
||||||
|
if (s > FFMIN(MAX_SUBPACKETS, avctx->block_align)) {
|
||||||
|
avpriv_request_sample(avctx, "subpackets > %d", FFMIN(MAX_SUBPACKETS, avctx->block_align));
|
||||||
|
return AVERROR_PATCHWELCOME;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to catch some obviously faulty streams, otherwise it might be exploitable */
|
|
||||||
if (q->samples_per_channel != 256 && q->samples_per_channel != 512 &&
|
|
||||||
q->samples_per_channel != 1024) {
|
|
||||||
avpriv_request_sample(avctx, "samples_per_channel = %d",
|
|
||||||
q->samples_per_channel);
|
|
||||||
return AVERROR_PATCHWELCOME;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Generate tables */
|
/* Generate tables */
|
||||||
init_pow2table();
|
init_pow2table();
|
||||||
init_gain_table(q);
|
init_gain_table(q);
|
||||||
@@ -1245,6 +1233,10 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
|
|||||||
if ((ret = init_cook_vlc_tables(q)))
|
if ((ret = init_cook_vlc_tables(q)))
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
||||||
|
if (avctx->block_align >= UINT_MAX / 2)
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
|
||||||
/* Pad the databuffer with:
|
/* Pad the databuffer with:
|
||||||
DECODE_BYTES_PAD1 or DECODE_BYTES_PAD2 for decode_bytes(),
|
DECODE_BYTES_PAD1 or DECODE_BYTES_PAD2 for decode_bytes(),
|
||||||
AV_INPUT_BUFFER_PADDING_SIZE, for the bitstreamreader. */
|
AV_INPUT_BUFFER_PADDING_SIZE, for the bitstreamreader. */
|
||||||
@@ -1268,6 +1260,14 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
|
|||||||
q->saturate_output = saturate_output_float;
|
q->saturate_output = saturate_output_float;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Try to catch some obviously faulty streams, otherwise it might be exploitable */
|
||||||
|
if (q->samples_per_channel != 256 && q->samples_per_channel != 512 &&
|
||||||
|
q->samples_per_channel != 1024) {
|
||||||
|
avpriv_request_sample(avctx, "samples_per_channel = %d",
|
||||||
|
q->samples_per_channel);
|
||||||
|
return AVERROR_PATCHWELCOME;
|
||||||
|
}
|
||||||
|
|
||||||
avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
|
avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
|
||||||
if (channel_mask)
|
if (channel_mask)
|
||||||
avctx->channel_layout = channel_mask;
|
avctx->channel_layout = channel_mask;
|
||||||
|
|||||||
+1
-2
@@ -63,7 +63,7 @@ static int cpia_decode_frame(AVCodecContext *avctx,
|
|||||||
uint8_t *y, *u, *v, *y_end, *u_end, *v_end;
|
uint8_t *y, *u, *v, *y_end, *u_end, *v_end;
|
||||||
|
|
||||||
// Check header
|
// Check header
|
||||||
if ( avpkt->size < FRAME_HEADER_SIZE + avctx->height * 3
|
if ( avpkt->size < FRAME_HEADER_SIZE
|
||||||
|| header[0] != MAGIC_0 || header[1] != MAGIC_1
|
|| header[0] != MAGIC_0 || header[1] != MAGIC_1
|
||||||
|| (header[17] != SUBSAMPLE_420 && header[17] != SUBSAMPLE_422)
|
|| (header[17] != SUBSAMPLE_420 && header[17] != SUBSAMPLE_422)
|
||||||
|| (header[18] != YUVORDER_YUYV && header[18] != YUVORDER_UYVY)
|
|| (header[18] != YUVORDER_YUYV && header[18] != YUVORDER_UYVY)
|
||||||
@@ -111,7 +111,6 @@ static int cpia_decode_frame(AVCodecContext *avctx,
|
|||||||
// Read line length, two byte little endian
|
// Read line length, two byte little endian
|
||||||
linelength = AV_RL16(src);
|
linelength = AV_RL16(src);
|
||||||
src += 2;
|
src += 2;
|
||||||
src_size -= 2;
|
|
||||||
|
|
||||||
if (src_size < linelength) {
|
if (src_size < linelength) {
|
||||||
av_frame_set_decode_error_flags(frame, FF_DECODE_ERROR_INVALID_BITSTREAM);
|
av_frame_set_decode_error_flags(frame, FF_DECODE_ERROR_INVALID_BITSTREAM);
|
||||||
|
|||||||
+2
-6
@@ -81,19 +81,15 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
switch ((buf[0] >> 1) & 7) {
|
switch ((buf[0] >> 1) & 7) {
|
||||||
case 0: { // lzo compression
|
case 0: { // lzo compression
|
||||||
int outlen = c->decomp_size, inlen = buf_size - 2;
|
int outlen = c->decomp_size, inlen = buf_size - 2;
|
||||||
if (av_lzo1x_decode(c->decomp_buf, &outlen, &buf[2], &inlen) || outlen) {
|
if (av_lzo1x_decode(c->decomp_buf, &outlen, &buf[2], &inlen))
|
||||||
av_log(avctx, AV_LOG_ERROR, "error during lzo decompression\n");
|
av_log(avctx, AV_LOG_ERROR, "error during lzo decompression\n");
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 1: { // zlib compression
|
case 1: { // zlib compression
|
||||||
#if CONFIG_ZLIB
|
#if CONFIG_ZLIB
|
||||||
unsigned long dlen = c->decomp_size;
|
unsigned long dlen = c->decomp_size;
|
||||||
if (uncompress(c->decomp_buf, &dlen, &buf[2], buf_size - 2) != Z_OK) {
|
if (uncompress(c->decomp_buf, &dlen, &buf[2], buf_size - 2) != Z_OK)
|
||||||
av_log(avctx, AV_LOG_ERROR, "error during zlib decompression\n");
|
av_log(avctx, AV_LOG_ERROR, "error during zlib decompression\n");
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
#else
|
#else
|
||||||
av_log(avctx, AV_LOG_ERROR, "compiled without zlib support\n");
|
av_log(avctx, AV_LOG_ERROR, "compiled without zlib support\n");
|
||||||
|
|||||||
+70
-94
@@ -159,7 +159,7 @@ static int parse_lfe_24(DCALbrDecoder *s)
|
|||||||
step_i = get_bits(&s->gb, 8);
|
step_i = get_bits(&s->gb, 8);
|
||||||
if (step_i > step_max) {
|
if (step_i > step_max) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "Invalid LFE step size index\n");
|
av_log(s->avctx, AV_LOG_ERROR, "Invalid LFE step size index\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
step = ff_dca_lfe_step_size_24[step_i];
|
step = ff_dca_lfe_step_size_24[step_i];
|
||||||
@@ -213,7 +213,7 @@ static int parse_lfe_16(DCALbrDecoder *s)
|
|||||||
step_i = get_bits(&s->gb, 8);
|
step_i = get_bits(&s->gb, 8);
|
||||||
if (step_i > step_max) {
|
if (step_i > step_max) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "Invalid LFE step size index\n");
|
av_log(s->avctx, AV_LOG_ERROR, "Invalid LFE step size index\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
step = ff_dca_lfe_step_size_16[step_i];
|
step = ff_dca_lfe_step_size_16[step_i];
|
||||||
@@ -251,17 +251,14 @@ static int parse_lfe_16(DCALbrDecoder *s)
|
|||||||
|
|
||||||
static int parse_lfe_chunk(DCALbrDecoder *s, LBRChunk *chunk)
|
static int parse_lfe_chunk(DCALbrDecoder *s, LBRChunk *chunk)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!(s->flags & LBR_FLAG_LFE_PRESENT))
|
if (!(s->flags & LBR_FLAG_LFE_PRESENT))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!chunk->len)
|
if (!chunk->len)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ret = init_get_bits8(&s->gb, chunk->data, chunk->len);
|
if (init_get_bits8(&s->gb, chunk->data, chunk->len) < 0)
|
||||||
if (ret < 0)
|
return -1;
|
||||||
return ret;
|
|
||||||
|
|
||||||
// Determine bit depth from chunk size
|
// Determine bit depth from chunk size
|
||||||
if (chunk->len >= 52)
|
if (chunk->len >= 52)
|
||||||
@@ -270,7 +267,7 @@ static int parse_lfe_chunk(DCALbrDecoder *s, LBRChunk *chunk)
|
|||||||
return parse_lfe_16(s);
|
return parse_lfe_16(s);
|
||||||
|
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "LFE chunk too short\n");
|
av_log(s->avctx, AV_LOG_ERROR, "LFE chunk too short\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int parse_vlc(GetBitContext *s, VLC *vlc, int max_depth)
|
static inline int parse_vlc(GetBitContext *s, VLC *vlc, int max_depth)
|
||||||
@@ -299,13 +296,13 @@ static int parse_tonal(DCALbrDecoder *s, int group)
|
|||||||
for (freq = 1;; freq++) {
|
for (freq = 1;; freq++) {
|
||||||
if (get_bits_left(&s->gb) < 1) {
|
if (get_bits_left(&s->gb) < 1) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "Tonal group chunk too short\n");
|
av_log(s->avctx, AV_LOG_ERROR, "Tonal group chunk too short\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
diff = parse_vlc(&s->gb, &ff_dca_vlc_tnl_grp[group], 2);
|
diff = parse_vlc(&s->gb, &ff_dca_vlc_tnl_grp[group], 2);
|
||||||
if (diff >= FF_ARRAY_ELEMS(ff_dca_fst_amp)) {
|
if (diff >= FF_ARRAY_ELEMS(ff_dca_fst_amp)) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "Invalid tonal frequency diff\n");
|
av_log(s->avctx, AV_LOG_ERROR, "Invalid tonal frequency diff\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
diff = get_bitsz(&s->gb, diff >> 2) + ff_dca_fst_amp[diff];
|
diff = get_bitsz(&s->gb, diff >> 2) + ff_dca_fst_amp[diff];
|
||||||
@@ -313,9 +310,9 @@ static int parse_tonal(DCALbrDecoder *s, int group)
|
|||||||
break; // End of subframe
|
break; // End of subframe
|
||||||
|
|
||||||
freq += diff - 2;
|
freq += diff - 2;
|
||||||
if (freq >> (5 - group) > s->nsubbands * 4 - 6) {
|
if (freq >> (5 - group) > s->nsubbands * 4 - 5) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "Invalid spectral line offset\n");
|
av_log(s->avctx, AV_LOG_ERROR, "Invalid spectral line offset\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main channel
|
// Main channel
|
||||||
@@ -366,21 +363,19 @@ static int parse_tonal(DCALbrDecoder *s, int group)
|
|||||||
|
|
||||||
static int parse_tonal_chunk(DCALbrDecoder *s, LBRChunk *chunk)
|
static int parse_tonal_chunk(DCALbrDecoder *s, LBRChunk *chunk)
|
||||||
{
|
{
|
||||||
int sb, group, ret;
|
int sb, group;
|
||||||
|
|
||||||
if (!chunk->len)
|
if (!chunk->len)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ret = init_get_bits8(&s->gb, chunk->data, chunk->len);
|
if (init_get_bits8(&s->gb, chunk->data, chunk->len) < 0)
|
||||||
|
return -1;
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
// Scale factors
|
// Scale factors
|
||||||
if (chunk->id == LBR_CHUNK_SCF || chunk->id == LBR_CHUNK_TONAL_SCF) {
|
if (chunk->id == LBR_CHUNK_SCF || chunk->id == LBR_CHUNK_TONAL_SCF) {
|
||||||
if (get_bits_left(&s->gb) < 36) {
|
if (get_bits_left(&s->gb) < 36) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "Tonal scale factor chunk too short\n");
|
av_log(s->avctx, AV_LOG_ERROR, "Tonal scale factor chunk too short\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return -1;
|
||||||
}
|
}
|
||||||
for (sb = 0; sb < 6; sb++)
|
for (sb = 0; sb < 6; sb++)
|
||||||
s->tonal_scf[sb] = get_bits(&s->gb, 6);
|
s->tonal_scf[sb] = get_bits(&s->gb, 6);
|
||||||
@@ -388,25 +383,20 @@ static int parse_tonal_chunk(DCALbrDecoder *s, LBRChunk *chunk)
|
|||||||
|
|
||||||
// Tonal groups
|
// Tonal groups
|
||||||
if (chunk->id == LBR_CHUNK_TONAL || chunk->id == LBR_CHUNK_TONAL_SCF)
|
if (chunk->id == LBR_CHUNK_TONAL || chunk->id == LBR_CHUNK_TONAL_SCF)
|
||||||
for (group = 0; group < 5; group++) {
|
for (group = 0; group < 5; group++)
|
||||||
ret = parse_tonal(s, group);
|
if (parse_tonal(s, group) < 0)
|
||||||
if (ret < 0)
|
return -1;
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int parse_tonal_group(DCALbrDecoder *s, LBRChunk *chunk)
|
static int parse_tonal_group(DCALbrDecoder *s, LBRChunk *chunk)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!chunk->len)
|
if (!chunk->len)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ret = init_get_bits8(&s->gb, chunk->data, chunk->len);
|
if (init_get_bits8(&s->gb, chunk->data, chunk->len) < 0)
|
||||||
if (ret < 0)
|
return -1;
|
||||||
return ret;
|
|
||||||
|
|
||||||
return parse_tonal(s, chunk->id);
|
return parse_tonal(s, chunk->id);
|
||||||
}
|
}
|
||||||
@@ -419,7 +409,7 @@ static int ensure_bits(GetBitContext *s, int n)
|
|||||||
{
|
{
|
||||||
int left = get_bits_left(s);
|
int left = get_bits_left(s);
|
||||||
if (left < 0)
|
if (left < 0)
|
||||||
return AVERROR_INVALIDDATA;
|
return -1;
|
||||||
if (left < n) {
|
if (left < n) {
|
||||||
skip_bits_long(s, left);
|
skip_bits_long(s, left);
|
||||||
return 1;
|
return 1;
|
||||||
@@ -448,7 +438,7 @@ static int parse_scale_factors(DCALbrDecoder *s, uint8_t *scf)
|
|||||||
dist = parse_vlc(&s->gb, &ff_dca_vlc_rsd_apprx, 1) + 1;
|
dist = parse_vlc(&s->gb, &ff_dca_vlc_rsd_apprx, 1) + 1;
|
||||||
if (dist > 7 - sf) {
|
if (dist > 7 - sf) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "Invalid scale factor distance\n");
|
av_log(s->avctx, AV_LOG_ERROR, "Invalid scale factor distance\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ensure_bits(&s->gb, 20))
|
if (ensure_bits(&s->gb, 20))
|
||||||
@@ -513,26 +503,22 @@ static int parse_st_code(GetBitContext *s, int min_v)
|
|||||||
|
|
||||||
static int parse_grid_1_chunk(DCALbrDecoder *s, LBRChunk *chunk, int ch1, int ch2)
|
static int parse_grid_1_chunk(DCALbrDecoder *s, LBRChunk *chunk, int ch1, int ch2)
|
||||||
{
|
{
|
||||||
int ch, sb, sf, nsubbands, ret;
|
int ch, sb, sf, nsubbands;
|
||||||
|
|
||||||
if (!chunk->len)
|
if (!chunk->len)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ret = init_get_bits8(&s->gb, chunk->data, chunk->len);
|
if (init_get_bits8(&s->gb, chunk->data, chunk->len) < 0)
|
||||||
if (ret < 0)
|
return -1;
|
||||||
return ret;
|
|
||||||
|
|
||||||
// Scale factors
|
// Scale factors
|
||||||
nsubbands = ff_dca_scf_to_grid_1[s->nsubbands - 1] + 1;
|
nsubbands = ff_dca_scf_to_grid_1[s->nsubbands - 1] + 1;
|
||||||
for (sb = 2; sb < nsubbands; sb++) {
|
for (sb = 2; sb < nsubbands; sb++) {
|
||||||
ret = parse_scale_factors(s, s->grid_1_scf[ch1][sb]);
|
if (parse_scale_factors(s, s->grid_1_scf[ch1][sb]) < 0)
|
||||||
if (ret < 0)
|
return -1;
|
||||||
return ret;
|
if (ch1 != ch2 && ff_dca_grid_1_to_scf[sb] < s->min_mono_subband
|
||||||
if (ch1 != ch2 && ff_dca_grid_1_to_scf[sb] < s->min_mono_subband) {
|
&& parse_scale_factors(s, s->grid_1_scf[ch2][sb]) < 0)
|
||||||
ret = parse_scale_factors(s, s->grid_1_scf[ch2][sb]);
|
return -1;
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (get_bits_left(&s->gb) < 1)
|
if (get_bits_left(&s->gb) < 1)
|
||||||
@@ -551,7 +537,7 @@ static int parse_grid_1_chunk(DCALbrDecoder *s, LBRChunk *chunk, int ch1, int ch
|
|||||||
|
|
||||||
if (get_bits_left(&s->gb) < 0) {
|
if (get_bits_left(&s->gb) < 0) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "First grid chunk too short\n");
|
av_log(s->avctx, AV_LOG_ERROR, "First grid chunk too short\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stereo image for partial mono mode
|
// Stereo image for partial mono mode
|
||||||
@@ -581,16 +567,14 @@ static int parse_grid_1_chunk(DCALbrDecoder *s, LBRChunk *chunk, int ch1, int ch
|
|||||||
|
|
||||||
static int parse_grid_1_sec_ch(DCALbrDecoder *s, int ch2)
|
static int parse_grid_1_sec_ch(DCALbrDecoder *s, int ch2)
|
||||||
{
|
{
|
||||||
int sb, nsubbands, ret;
|
int sb, nsubbands;
|
||||||
|
|
||||||
// Scale factors
|
// Scale factors
|
||||||
nsubbands = ff_dca_scf_to_grid_1[s->nsubbands - 1] + 1;
|
nsubbands = ff_dca_scf_to_grid_1[s->nsubbands - 1] + 1;
|
||||||
for (sb = 2; sb < nsubbands; sb++) {
|
for (sb = 2; sb < nsubbands; sb++) {
|
||||||
if (ff_dca_grid_1_to_scf[sb] >= s->min_mono_subband) {
|
if (ff_dca_grid_1_to_scf[sb] >= s->min_mono_subband
|
||||||
ret = parse_scale_factors(s, s->grid_1_scf[ch2][sb]);
|
&& parse_scale_factors(s, s->grid_1_scf[ch2][sb]) < 0)
|
||||||
if (ret < 0)
|
return -1;
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Average values for third grid
|
// Average values for third grid
|
||||||
@@ -730,7 +714,7 @@ static int parse_ts(DCALbrDecoder *s, int ch1, int ch2,
|
|||||||
s->sb_indices[sb] = sb_reorder;
|
s->sb_indices[sb] = sb_reorder;
|
||||||
}
|
}
|
||||||
if (sb_reorder >= s->nsubbands)
|
if (sb_reorder >= s->nsubbands)
|
||||||
return AVERROR_INVALIDDATA;
|
return -1;
|
||||||
|
|
||||||
// Third grid scale factors
|
// Third grid scale factors
|
||||||
if (sb == 12) {
|
if (sb == 12) {
|
||||||
@@ -752,7 +736,7 @@ static int parse_ts(DCALbrDecoder *s, int ch1, int ch2,
|
|||||||
|
|
||||||
quant_level = s->quant_levels[ch1 / 2][sb];
|
quant_level = s->quant_levels[ch1 / 2][sb];
|
||||||
if (!quant_level)
|
if (!quant_level)
|
||||||
return AVERROR_INVALIDDATA;
|
return -1;
|
||||||
|
|
||||||
// Time samples for one or both channels
|
// Time samples for one or both channels
|
||||||
if (sb < s->max_mono_subband && sb_reorder >= s->min_mono_subband) {
|
if (sb < s->max_mono_subband && sb_reorder >= s->min_mono_subband) {
|
||||||
@@ -813,14 +797,13 @@ static int parse_lpc(DCALbrDecoder *s, int ch1, int ch2, int start_sb, int end_s
|
|||||||
static int parse_high_res_grid(DCALbrDecoder *s, LBRChunk *chunk, int ch1, int ch2)
|
static int parse_high_res_grid(DCALbrDecoder *s, LBRChunk *chunk, int ch1, int ch2)
|
||||||
{
|
{
|
||||||
int quant_levels[DCA_LBR_SUBBANDS];
|
int quant_levels[DCA_LBR_SUBBANDS];
|
||||||
int sb, ch, ol, st, max_sb, profile, ret;
|
int sb, ch, ol, st, max_sb, profile;
|
||||||
|
|
||||||
if (!chunk->len)
|
if (!chunk->len)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ret = init_get_bits8(&s->gb, chunk->data, chunk->len);
|
if (init_get_bits8(&s->gb, chunk->data, chunk->len) < 0)
|
||||||
if (ret < 0)
|
return -1;
|
||||||
return ret;
|
|
||||||
|
|
||||||
// Quantizer profile
|
// Quantizer profile
|
||||||
profile = get_bits(&s->gb, 8);
|
profile = get_bits(&s->gb, 8);
|
||||||
@@ -854,20 +837,18 @@ static int parse_high_res_grid(DCALbrDecoder *s, LBRChunk *chunk, int ch1, int c
|
|||||||
s->quant_levels[ch1 / 2][sb] = quant_levels[sb];
|
s->quant_levels[ch1 / 2][sb] = quant_levels[sb];
|
||||||
|
|
||||||
// LPC for the first two subbands
|
// LPC for the first two subbands
|
||||||
ret = parse_lpc(s, ch1, ch2, 0, 2);
|
if (parse_lpc(s, ch1, ch2, 0, 2) < 0)
|
||||||
if (ret < 0)
|
return -1;
|
||||||
return ret;
|
|
||||||
|
|
||||||
// Time-samples for the first two subbands of main channel
|
// Time-samples for the first two subbands of main channel
|
||||||
ret = parse_ts(s, ch1, ch2, 0, 2, 0);
|
if (parse_ts(s, ch1, ch2, 0, 2, 0) < 0)
|
||||||
if (ret < 0)
|
return -1;
|
||||||
return ret;
|
|
||||||
|
|
||||||
// First two bands of the first grid
|
// First two bands of the first grid
|
||||||
for (sb = 0; sb < 2; sb++)
|
for (sb = 0; sb < 2; sb++)
|
||||||
for (ch = ch1; ch <= ch2; ch++)
|
for (ch = ch1; ch <= ch2; ch++)
|
||||||
if ((ret = parse_scale_factors(s, s->grid_1_scf[ch][sb])) < 0)
|
if (parse_scale_factors(s, s->grid_1_scf[ch][sb]) < 0)
|
||||||
return ret;
|
return -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -916,42 +897,39 @@ static int parse_grid_2(DCALbrDecoder *s, int ch1, int ch2,
|
|||||||
|
|
||||||
static int parse_ts1_chunk(DCALbrDecoder *s, LBRChunk *chunk, int ch1, int ch2)
|
static int parse_ts1_chunk(DCALbrDecoder *s, LBRChunk *chunk, int ch1, int ch2)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
if (!chunk->len)
|
if (!chunk->len)
|
||||||
return 0;
|
return 0;
|
||||||
if ((ret = init_get_bits8(&s->gb, chunk->data, chunk->len)) < 0)
|
if (init_get_bits8(&s->gb, chunk->data, chunk->len) < 0)
|
||||||
return ret;
|
return -1;
|
||||||
if ((ret = parse_lpc(s, ch1, ch2, 2, 3)) < 0)
|
if (parse_lpc(s, ch1, ch2, 2, 3) < 0)
|
||||||
return ret;
|
return -1;
|
||||||
if ((ret = parse_ts(s, ch1, ch2, 2, 4, 0)) < 0)
|
if (parse_ts(s, ch1, ch2, 2, 4, 0) < 0)
|
||||||
return ret;
|
return -1;
|
||||||
if ((ret = parse_grid_2(s, ch1, ch2, 0, 1, 0)) < 0)
|
if (parse_grid_2(s, ch1, ch2, 0, 1, 0) < 0)
|
||||||
return ret;
|
return -1;
|
||||||
if ((ret = parse_ts(s, ch1, ch2, 4, 6, 0)) < 0)
|
if (parse_ts(s, ch1, ch2, 4, 6, 0) < 0)
|
||||||
return ret;
|
return -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int parse_ts2_chunk(DCALbrDecoder *s, LBRChunk *chunk, int ch1, int ch2)
|
static int parse_ts2_chunk(DCALbrDecoder *s, LBRChunk *chunk, int ch1, int ch2)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!chunk->len)
|
if (!chunk->len)
|
||||||
return 0;
|
return 0;
|
||||||
if ((ret = init_get_bits8(&s->gb, chunk->data, chunk->len)) < 0)
|
if (init_get_bits8(&s->gb, chunk->data, chunk->len) < 0)
|
||||||
return ret;
|
return -1;
|
||||||
if ((ret = parse_grid_2(s, ch1, ch2, 1, 3, 0)) < 0)
|
if (parse_grid_2(s, ch1, ch2, 1, 3, 0) < 0)
|
||||||
return ret;
|
return -1;
|
||||||
if ((ret = parse_ts(s, ch1, ch2, 6, s->max_mono_subband, 0)) < 0)
|
if (parse_ts(s, ch1, ch2, 6, s->max_mono_subband, 0) < 0)
|
||||||
return ret;
|
return -1;
|
||||||
if (ch1 != ch2) {
|
if (ch1 != ch2) {
|
||||||
if ((ret = parse_grid_1_sec_ch(s, ch2)) < 0)
|
if (parse_grid_1_sec_ch(s, ch2) < 0)
|
||||||
return ret;
|
return -1;
|
||||||
if ((ret = parse_grid_2(s, ch1, ch2, 0, 3, 1)) < 0)
|
if (parse_grid_2(s, ch1, ch2, 0, 3, 1) < 0)
|
||||||
return ret;
|
return -1;
|
||||||
}
|
}
|
||||||
if ((ret = parse_ts(s, ch1, ch2, s->min_mono_subband, s->nsubbands, 1)) < 0)
|
if (parse_ts(s, ch1, ch2, s->min_mono_subband, s->nsubbands, 1) < 0)
|
||||||
return ret;
|
return -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -959,13 +937,11 @@ static int init_sample_rate(DCALbrDecoder *s)
|
|||||||
{
|
{
|
||||||
double scale = (-1.0 / (1 << 17)) * sqrt(1 << (2 - s->limited_range));
|
double scale = (-1.0 / (1 << 17)) * sqrt(1 << (2 - s->limited_range));
|
||||||
int i, br_per_ch = s->bit_rate_scaled / s->nchannels_total;
|
int i, br_per_ch = s->bit_rate_scaled / s->nchannels_total;
|
||||||
int ret;
|
|
||||||
|
|
||||||
ff_mdct_end(&s->imdct);
|
ff_mdct_end(&s->imdct);
|
||||||
|
|
||||||
ret = ff_mdct_init(&s->imdct, s->freq_range + 6, 1, scale);
|
if (ff_mdct_init(&s->imdct, s->freq_range + 6, 1, scale) < 0)
|
||||||
if (ret < 0)
|
return -1;
|
||||||
return ret;
|
|
||||||
|
|
||||||
for (i = 0; i < 32 << s->freq_range; i++)
|
for (i = 0; i < 32 << s->freq_range; i++)
|
||||||
s->window[i] = ff_dca_long_window[i << (2 - s->freq_range)];
|
s->window[i] = ff_dca_long_window[i << (2 - s->freq_range)];
|
||||||
@@ -1004,7 +980,7 @@ static int alloc_sample_buffer(DCALbrDecoder *s)
|
|||||||
// Reallocate time sample buffer
|
// Reallocate time sample buffer
|
||||||
av_fast_mallocz(&s->ts_buffer, &s->ts_size, nsamples * sizeof(float));
|
av_fast_mallocz(&s->ts_buffer, &s->ts_size, nsamples * sizeof(float));
|
||||||
if (!s->ts_buffer)
|
if (!s->ts_buffer)
|
||||||
return AVERROR(ENOMEM);
|
return -1;
|
||||||
|
|
||||||
ptr = s->ts_buffer + DCA_LBR_TIME_HISTORY;
|
ptr = s->ts_buffer + DCA_LBR_TIME_HISTORY;
|
||||||
for (ch = 0; ch < s->nchannels; ch++) {
|
for (ch = 0; ch < s->nchannels; ch++) {
|
||||||
@@ -1825,7 +1801,7 @@ av_cold int ff_dca_lbr_init(DCALbrDecoder *s)
|
|||||||
init_tables();
|
init_tables();
|
||||||
|
|
||||||
if (!(s->fdsp = avpriv_float_dsp_alloc(0)))
|
if (!(s->fdsp = avpriv_float_dsp_alloc(0)))
|
||||||
return AVERROR(ENOMEM);
|
return -1;
|
||||||
|
|
||||||
s->lbr_rand = 1;
|
s->lbr_rand = 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
+2
-2
@@ -320,7 +320,7 @@ static void dmix_sub_c(int32_t *dst, const int32_t *src, int coeff, ptrdiff_t le
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
dst[i] -= (unsigned)mul15(src[i], coeff);
|
dst[i] -= mul15(src[i], coeff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dmix_add_c(int32_t *dst, const int32_t *src, int coeff, ptrdiff_t len)
|
static void dmix_add_c(int32_t *dst, const int32_t *src, int coeff, ptrdiff_t len)
|
||||||
@@ -328,7 +328,7 @@ static void dmix_add_c(int32_t *dst, const int32_t *src, int coeff, ptrdiff_t le
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
dst[i] += (unsigned)mul15(src[i], coeff);
|
dst[i] += mul15(src[i], coeff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dmix_scale_c(int32_t *dst, int scale, ptrdiff_t len)
|
static void dmix_scale_c(int32_t *dst, int scale, ptrdiff_t len)
|
||||||
|
|||||||
+7
-8
@@ -39,7 +39,7 @@
|
|||||||
|
|
||||||
#define DDPF_FOURCC (1 << 2)
|
#define DDPF_FOURCC (1 << 2)
|
||||||
#define DDPF_PALETTE (1 << 5)
|
#define DDPF_PALETTE (1 << 5)
|
||||||
#define DDPF_NORMALMAP (1U << 31)
|
#define DDPF_NORMALMAP (1 << 31)
|
||||||
|
|
||||||
enum DDSPostProc {
|
enum DDSPostProc {
|
||||||
DDS_NONE = 0,
|
DDS_NONE = 0,
|
||||||
@@ -617,7 +617,6 @@ static int dds_decode(AVCodecContext *avctx, void *data,
|
|||||||
AVFrame *frame = data;
|
AVFrame *frame = data;
|
||||||
int mipmap;
|
int mipmap;
|
||||||
int ret;
|
int ret;
|
||||||
int width, height;
|
|
||||||
|
|
||||||
ff_texturedsp_init(&ctx->texdsp);
|
ff_texturedsp_init(&ctx->texdsp);
|
||||||
bytestream2_init(gbc, avpkt->data, avpkt->size);
|
bytestream2_init(gbc, avpkt->data, avpkt->size);
|
||||||
@@ -636,9 +635,9 @@ static int dds_decode(AVCodecContext *avctx, void *data,
|
|||||||
|
|
||||||
bytestream2_skip(gbc, 4); // flags
|
bytestream2_skip(gbc, 4); // flags
|
||||||
|
|
||||||
height = bytestream2_get_le32(gbc);
|
avctx->height = bytestream2_get_le32(gbc);
|
||||||
width = bytestream2_get_le32(gbc);
|
avctx->width = bytestream2_get_le32(gbc);
|
||||||
ret = ff_set_dimensions(avctx, width, height);
|
ret = av_image_check_size(avctx->width, avctx->height, 0, avctx);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Invalid image size %dx%d.\n",
|
av_log(avctx, AV_LOG_ERROR, "Invalid image size %dx%d.\n",
|
||||||
avctx->width, avctx->height);
|
avctx->width, avctx->height);
|
||||||
@@ -681,7 +680,7 @@ static int dds_decode(AVCodecContext *avctx, void *data,
|
|||||||
/* Use the decompress function on the texture, one block per thread. */
|
/* Use the decompress function on the texture, one block per thread. */
|
||||||
ctx->tex_data = gbc->buffer;
|
ctx->tex_data = gbc->buffer;
|
||||||
avctx->execute2(avctx, decompress_texture_thread, frame, NULL, ctx->slice_count);
|
avctx->execute2(avctx, decompress_texture_thread, frame, NULL, ctx->slice_count);
|
||||||
} else if (!ctx->paletted && ctx->bpp == 4 && avctx->pix_fmt == AV_PIX_FMT_PAL8) {
|
} else if (!ctx->paletted && ctx->bpp == 4) {
|
||||||
uint8_t *dst = frame->data[0];
|
uint8_t *dst = frame->data[0];
|
||||||
int x, y, i;
|
int x, y, i;
|
||||||
|
|
||||||
@@ -692,7 +691,7 @@ static int dds_decode(AVCodecContext *avctx, void *data,
|
|||||||
(frame->data[1][2+i*4]<<0)+
|
(frame->data[1][2+i*4]<<0)+
|
||||||
(frame->data[1][1+i*4]<<8)+
|
(frame->data[1][1+i*4]<<8)+
|
||||||
(frame->data[1][0+i*4]<<16)+
|
(frame->data[1][0+i*4]<<16)+
|
||||||
((unsigned)frame->data[1][3+i*4]<<24)
|
(frame->data[1][3+i*4]<<24)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
frame->palette_has_changed = 1;
|
frame->palette_has_changed = 1;
|
||||||
@@ -723,7 +722,7 @@ static int dds_decode(AVCodecContext *avctx, void *data,
|
|||||||
(frame->data[1][2+i*4]<<0)+
|
(frame->data[1][2+i*4]<<0)+
|
||||||
(frame->data[1][1+i*4]<<8)+
|
(frame->data[1][1+i*4]<<8)+
|
||||||
(frame->data[1][0+i*4]<<16)+
|
(frame->data[1][0+i*4]<<16)+
|
||||||
((unsigned)frame->data[1][3+i*4]<<24)
|
(frame->data[1][3+i*4]<<24)
|
||||||
);
|
);
|
||||||
|
|
||||||
frame->palette_has_changed = 1;
|
frame->palette_has_changed = 1;
|
||||||
|
|||||||
+4
-7
@@ -41,7 +41,7 @@ static av_cold int dfa_decode_init(AVCodecContext *avctx)
|
|||||||
|
|
||||||
avctx->pix_fmt = AV_PIX_FMT_PAL8;
|
avctx->pix_fmt = AV_PIX_FMT_PAL8;
|
||||||
|
|
||||||
if (!avctx->width || !avctx->height || FFMAX(avctx->width, avctx->height) >= (1<<16))
|
if (!avctx->width || !avctx->height)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
|
|
||||||
av_assert0(av_image_check_size(avctx->width, avctx->height, 0, avctx) >= 0);
|
av_assert0(av_image_check_size(avctx->width, avctx->height, 0, avctx) >= 0);
|
||||||
@@ -67,8 +67,7 @@ static int decode_tsw1(GetByteContext *gb, uint8_t *frame, int width, int height
|
|||||||
const uint8_t *frame_start = frame;
|
const uint8_t *frame_start = frame;
|
||||||
const uint8_t *frame_end = frame + width * height;
|
const uint8_t *frame_end = frame + width * height;
|
||||||
int mask = 0x10000, bitbuf = 0;
|
int mask = 0x10000, bitbuf = 0;
|
||||||
int v, count;
|
int v, count, segments;
|
||||||
unsigned segments;
|
|
||||||
unsigned offset;
|
unsigned offset;
|
||||||
|
|
||||||
segments = bytestream2_get_le32(gb);
|
segments = bytestream2_get_le32(gb);
|
||||||
@@ -176,7 +175,7 @@ static int decode_dds1(GetByteContext *gb, uint8_t *frame, int width, int height
|
|||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
frame += v;
|
frame += v;
|
||||||
} else {
|
} else {
|
||||||
if (frame_end - frame < width + 4)
|
if (frame_end - frame < width + 3)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
frame[0] = frame[1] =
|
frame[0] = frame[1] =
|
||||||
frame[width] = frame[width + 1] = bytestream2_get_byte(gb);
|
frame[width] = frame[width + 1] = bytestream2_get_byte(gb);
|
||||||
@@ -250,7 +249,7 @@ static int decode_wdlt(GetByteContext *gb, uint8_t *frame, int width, int height
|
|||||||
segments = bytestream2_get_le16u(gb);
|
segments = bytestream2_get_le16u(gb);
|
||||||
while ((segments & 0xC000) == 0xC000) {
|
while ((segments & 0xC000) == 0xC000) {
|
||||||
unsigned skip_lines = -(int16_t)segments;
|
unsigned skip_lines = -(int16_t)segments;
|
||||||
int64_t delta = -((int16_t)segments * (int64_t)width);
|
unsigned delta = -((int16_t)segments * width);
|
||||||
if (frame_end - frame <= delta || y + lines + skip_lines > height)
|
if (frame_end - frame <= delta || y + lines + skip_lines > height)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
frame += delta;
|
frame += delta;
|
||||||
@@ -353,8 +352,6 @@ static int dfa_decode_frame(AVCodecContext *avctx,
|
|||||||
|
|
||||||
bytestream2_init(&gb, avpkt->data, avpkt->size);
|
bytestream2_init(&gb, avpkt->data, avpkt->size);
|
||||||
while (bytestream2_get_bytes_left(&gb) > 0) {
|
while (bytestream2_get_bytes_left(&gb) > 0) {
|
||||||
if (bytestream2_get_bytes_left(&gb) < 12)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
bytestream2_skip(&gb, 4);
|
bytestream2_skip(&gb, 4);
|
||||||
chunk_size = bytestream2_get_le32(&gb);
|
chunk_size = bytestream2_get_le32(&gb);
|
||||||
chunk_type = bytestream2_get_le32(&gb);
|
chunk_type = bytestream2_get_le32(&gb);
|
||||||
|
|||||||
+12
-12
@@ -93,40 +93,40 @@ void ff_spatial_idwt_slice2(DWTContext *d, int y);
|
|||||||
|
|
||||||
// shared stuff for simd optimizations
|
// shared stuff for simd optimizations
|
||||||
#define COMPOSE_53iL0(b0, b1, b2)\
|
#define COMPOSE_53iL0(b0, b1, b2)\
|
||||||
(b1 - (unsigned)((int)(b0 + (unsigned)(b2) + 2) >> 2))
|
(b1 - ((b0 + b2 + 2) >> 2))
|
||||||
|
|
||||||
#define COMPOSE_DIRAC53iH0(b0, b1, b2)\
|
#define COMPOSE_DIRAC53iH0(b0, b1, b2)\
|
||||||
(b1 + (unsigned)((int)(b0 + (unsigned)(b2) + 1) >> 1))
|
(b1 + ((b0 + b2 + 1) >> 1))
|
||||||
|
|
||||||
#define COMPOSE_DD97iH0(b0, b1, b2, b3, b4)\
|
#define COMPOSE_DD97iH0(b0, b1, b2, b3, b4)\
|
||||||
(int)(((unsigned)(b2) + ((int)(9U*b1 + 9U*b3 - b4 - b0 + 8) >> 4)))
|
(b2 + ((-b0 + 9*b1 + 9*b3 - b4 + 8) >> 4))
|
||||||
|
|
||||||
#define COMPOSE_DD137iL0(b0, b1, b2, b3, b4)\
|
#define COMPOSE_DD137iL0(b0, b1, b2, b3, b4)\
|
||||||
(int)(((unsigned)(b2) - ((int)(9U*b1 + 9U*b3 - b4 - b0 + 16) >> 5)))
|
(b2 - ((-b0 + 9*b1 + 9*b3 - b4 + 16) >> 5))
|
||||||
|
|
||||||
#define COMPOSE_HAARiL0(b0, b1)\
|
#define COMPOSE_HAARiL0(b0, b1)\
|
||||||
((int)(b0 - (unsigned)((int)(b1 + 1U) >> 1)))
|
(b0 - ((b1 + 1) >> 1))
|
||||||
|
|
||||||
#define COMPOSE_HAARiH0(b0, b1)\
|
#define COMPOSE_HAARiH0(b0, b1)\
|
||||||
((int)(b0 + (unsigned)(b1)))
|
(b0 + b1)
|
||||||
|
|
||||||
#define COMPOSE_FIDELITYiL0(b0, b1, b2, b3, b4, b5, b6, b7, b8)\
|
#define COMPOSE_FIDELITYiL0(b0, b1, b2, b3, b4, b5, b6, b7, b8)\
|
||||||
((unsigned)b4 - ((int)(-8*(b0+(unsigned)b8) + 21*(b1+(unsigned)b7) - 46*(b2+(unsigned)b6) + 161*(b3+(unsigned)b5) + 128) >> 8))
|
(b4 - ((-8*(b0+b8) + 21*(b1+b7) - 46*(b2+b6) + 161*(b3+b5) + 128) >> 8))
|
||||||
|
|
||||||
#define COMPOSE_FIDELITYiH0(b0, b1, b2, b3, b4, b5, b6, b7, b8)\
|
#define COMPOSE_FIDELITYiH0(b0, b1, b2, b3, b4, b5, b6, b7, b8)\
|
||||||
((unsigned)b4 + ((int)(-2*(b0+(unsigned)b8) + 10*(b1+(unsigned)b7) - 25*(b2+(unsigned)b6) + 81*(b3+(unsigned)b5) + 128) >> 8))
|
(b4 + ((-2*(b0+b8) + 10*(b1+b7) - 25*(b2+b6) + 81*(b3+b5) + 128) >> 8))
|
||||||
|
|
||||||
#define COMPOSE_DAUB97iL1(b0, b1, b2)\
|
#define COMPOSE_DAUB97iL1(b0, b1, b2)\
|
||||||
((unsigned)(b1) - ((int)(1817*(b0 + (unsigned)b2) + 2048) >> 12))
|
(b1 - ((1817*(b0 + b2) + 2048) >> 12))
|
||||||
|
|
||||||
#define COMPOSE_DAUB97iH1(b0, b1, b2)\
|
#define COMPOSE_DAUB97iH1(b0, b1, b2)\
|
||||||
((unsigned)(b1) - ((int)( 113*(b0 + (unsigned)b2) + 64) >> 7))
|
(b1 - (( 113*(b0 + b2) + 64) >> 7))
|
||||||
|
|
||||||
#define COMPOSE_DAUB97iL0(b0, b1, b2)\
|
#define COMPOSE_DAUB97iL0(b0, b1, b2)\
|
||||||
((unsigned)(b1) + ((int)( 217*(b0 + (unsigned)b2) + 2048) >> 12))
|
(b1 + (( 217*(b0 + b2) + 2048) >> 12))
|
||||||
|
|
||||||
#define COMPOSE_DAUB97iH0(b0, b1, b2)\
|
#define COMPOSE_DAUB97iH0(b0, b1, b2)\
|
||||||
((unsigned)(b1) + ((int)(6497*(b0 + (unsigned)b2) + 2048) >> 12))
|
(b1 + ((6497*(b0 + b2) + 2048) >> 12))
|
||||||
|
|
||||||
|
|
||||||
#endif /* AVCODEC_DWT_H */
|
#endif /* AVCODEC_DWT_H */
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ static void RENAME(vertical_compose53iL0)(uint8_t *_b0, uint8_t *_b1, uint8_t *_
|
|||||||
TYPE *b1 = (TYPE *)_b1;
|
TYPE *b1 = (TYPE *)_b1;
|
||||||
TYPE *b2 = (TYPE *)_b2;
|
TYPE *b2 = (TYPE *)_b2;
|
||||||
for (i = 0; i < width; i++)
|
for (i = 0; i < width; i++)
|
||||||
b1[i] -= (unsigned)((int)(b0[i] + (unsigned)b2[i] + 2) >> 2);
|
b1[i] -= (b0[i] + b2[i] + 2) >> 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_always_inline void RENAME(interleave)(TYPE *dst, TYPE *src0, TYPE *src1, int w2,
|
static av_always_inline void RENAME(interleave)(TYPE *dst, TYPE *src0, TYPE *src1, int w2,
|
||||||
@@ -57,8 +57,8 @@ static av_always_inline void RENAME(interleave)(TYPE *dst, TYPE *src0, TYPE *src
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < w2; i++) {
|
for (i = 0; i < w2; i++) {
|
||||||
dst[2*i ] = ((int)(src0[i] + (unsigned)add)) >> shift;
|
dst[2*i ] = (src0[i] + add) >> shift;
|
||||||
dst[2*i+1] = ((int)(src1[i] + (unsigned)add)) >> shift;
|
dst[2*i+1] = (src1[i] + add) >> shift;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,8 +95,8 @@ static void RENAME(horizontal_compose_dd97i)(uint8_t *_b, uint8_t *_tmp, int w)
|
|||||||
tmp[w2+1] = tmp[w2] = tmp[w2-1];
|
tmp[w2+1] = tmp[w2] = tmp[w2-1];
|
||||||
|
|
||||||
for (x = 0; x < w2; x++) {
|
for (x = 0; x < w2; x++) {
|
||||||
b[2*x ] = ((int)(tmp[x] + 1U))>>1;
|
b[2*x ] = (tmp[x] + 1)>>1;
|
||||||
b[2*x+1] = ((int)(COMPOSE_DD97iH0(tmp[x-1], tmp[x], b[x+w2], tmp[x+1], tmp[x+2]) + 1U))>>1;
|
b[2*x+1] = (COMPOSE_DD97iH0(tmp[x-1], tmp[x], b[x+w2], tmp[x+1], tmp[x+2]) + 1)>>1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,8 +118,8 @@ static void RENAME(horizontal_compose_dd137i)(uint8_t *_b, uint8_t *_tmp, int w)
|
|||||||
tmp[w2+1] = tmp[w2] = tmp[w2-1];
|
tmp[w2+1] = tmp[w2] = tmp[w2-1];
|
||||||
|
|
||||||
for (x = 0; x < w2; x++) {
|
for (x = 0; x < w2; x++) {
|
||||||
b[2*x ] = ((int)(tmp[x] + 1U))>>1;
|
b[2*x ] = (tmp[x] + 1)>>1;
|
||||||
b[2*x+1] = ((int)(COMPOSE_DD97iH0(tmp[x-1], tmp[x], b[x+w2], tmp[x+1], tmp[x+2]) + 1U))>>1;
|
b[2*x+1] = (COMPOSE_DD97iH0(tmp[x-1], tmp[x], b[x+w2], tmp[x+1], tmp[x+2]) + 1)>>1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,15 +190,15 @@ static void RENAME(horizontal_compose_daub97i)(uint8_t *_b, uint8_t *_temp, int
|
|||||||
|
|
||||||
// second stage combined with interleave and shift
|
// second stage combined with interleave and shift
|
||||||
b0 = b2 = COMPOSE_DAUB97iL0(temp[w2], temp[0], temp[w2]);
|
b0 = b2 = COMPOSE_DAUB97iL0(temp[w2], temp[0], temp[w2]);
|
||||||
b[0] = ~((~b0) >> 1);
|
b[0] = (b0 + 1) >> 1;
|
||||||
for (x = 1; x < w2; x++) {
|
for (x = 1; x < w2; x++) {
|
||||||
b2 = COMPOSE_DAUB97iL0(temp[x+w2-1], temp[x ], temp[x+w2]);
|
b2 = COMPOSE_DAUB97iL0(temp[x+w2-1], temp[x ], temp[x+w2]);
|
||||||
b1 = COMPOSE_DAUB97iH0( b0, temp[x+w2-1], b2 );
|
b1 = COMPOSE_DAUB97iH0( b0, temp[x+w2-1], b2 );
|
||||||
b[2*x-1] = ~((~b1) >> 1);
|
b[2*x-1] = (b1 + 1) >> 1;
|
||||||
b[2*x ] = ~((~b2) >> 1);
|
b[2*x ] = (b2 + 1) >> 1;
|
||||||
b0 = b2;
|
b0 = b2;
|
||||||
}
|
}
|
||||||
b[w-1] = ~((~COMPOSE_DAUB97iH0(b2, temp[w-1], b2)) >> 1);
|
b[w-1] = (COMPOSE_DAUB97iH0(b2, temp[w-1], b2) + 1) >> 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RENAME(vertical_compose_dirac53iH0)(uint8_t *_b0, uint8_t *_b1, uint8_t *_b2,
|
static void RENAME(vertical_compose_dirac53iH0)(uint8_t *_b0, uint8_t *_b1, uint8_t *_b2,
|
||||||
|
|||||||
@@ -212,10 +212,10 @@ static int dirac_combine_frame(AVCodecParserContext *s, AVCodecContext *avctx,
|
|||||||
if (parse_timing_info && pu1.prev_pu_offset >= 13) {
|
if (parse_timing_info && pu1.prev_pu_offset >= 13) {
|
||||||
uint8_t *cur_pu = pc->buffer +
|
uint8_t *cur_pu = pc->buffer +
|
||||||
pc->index - 13 - pu1.prev_pu_offset;
|
pc->index - 13 - pu1.prev_pu_offset;
|
||||||
int64_t pts = AV_RB32(cur_pu + 13);
|
int pts = AV_RB32(cur_pu + 13);
|
||||||
if (s->last_pts == 0 && s->last_dts == 0)
|
if (s->last_pts == 0 && s->last_dts == 0)
|
||||||
s->dts = pts - 1;
|
s->dts = pts - 1;
|
||||||
else if (s->last_dts != AV_NOPTS_VALUE)
|
else
|
||||||
s->dts = s->last_dts + 1;
|
s->dts = s->last_dts + 1;
|
||||||
s->pts = pts;
|
s->pts = pts;
|
||||||
if (!avctx->has_b_frames && (cur_pu[4] & 0x03))
|
if (!avctx->has_b_frames && (cur_pu[4] & 0x03))
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
#define APPEND_RESIDUE(N, M) \
|
#define APPEND_RESIDUE(N, M) \
|
||||||
N |= M >> (N ## _bits); \
|
N |= M >> (N ## _bits); \
|
||||||
N ## _bits = (N ## _bits + (M ## _bits)) & 0x3F
|
N ## _bits += (M ## _bits)
|
||||||
|
|
||||||
int ff_dirac_golomb_read_32bit(DiracGolombLUT *lut_ctx, const uint8_t *buf,
|
int ff_dirac_golomb_read_32bit(DiracGolombLUT *lut_ctx, const uint8_t *buf,
|
||||||
int bytes, uint8_t *_dst, int coeffs)
|
int bytes, uint8_t *_dst, int coeffs)
|
||||||
@@ -216,14 +216,9 @@ static void generate_offset_lut(DiracGolombLUT *lut, int off)
|
|||||||
INIT_RESIDUE(res);
|
INIT_RESIDUE(res);
|
||||||
SET_RESIDUE(res, idx, LUT_BITS);
|
SET_RESIDUE(res, idx, LUT_BITS);
|
||||||
|
|
||||||
|
l->preamble = CONVERT_TO_RESIDUE(res >> (RSIZE_BITS - off), off);
|
||||||
l->preamble_bits = off;
|
l->preamble_bits = off;
|
||||||
if (off) {
|
l->sign = ((l->preamble >> (RSIZE_BITS - l->preamble_bits)) & 1) ? -1 : +1;
|
||||||
l->preamble = CONVERT_TO_RESIDUE(res >> (RSIZE_BITS - off), off);
|
|
||||||
l->sign = ((l->preamble >> (RSIZE_BITS - l->preamble_bits)) & 1) ? -1 : +1;
|
|
||||||
} else {
|
|
||||||
l->preamble = 0;
|
|
||||||
l->sign = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
search_for_golomb(l, res << off, LUT_BITS - off);
|
search_for_golomb(l, res << off, LUT_BITS - off);
|
||||||
}
|
}
|
||||||
|
|||||||
+22
-48
@@ -139,7 +139,7 @@ typedef struct DiracContext {
|
|||||||
GetBitContext gb;
|
GetBitContext gb;
|
||||||
AVDiracSeqHeader seq;
|
AVDiracSeqHeader seq;
|
||||||
int seen_sequence_header;
|
int seen_sequence_header;
|
||||||
int64_t frame_number; /* number of the next frame to display */
|
int frame_number; /* number of the next frame to display */
|
||||||
Plane plane[3];
|
Plane plane[3];
|
||||||
int chroma_x_shift;
|
int chroma_x_shift;
|
||||||
int chroma_y_shift;
|
int chroma_y_shift;
|
||||||
@@ -248,7 +248,7 @@ enum dirac_subband {
|
|||||||
/* magic number division by 3 from schroedinger */
|
/* magic number division by 3 from schroedinger */
|
||||||
static inline int divide3(int x)
|
static inline int divide3(int x)
|
||||||
{
|
{
|
||||||
return (int)((x+1U)*21845 + 10922) >> 16;
|
return ((x+1)*21845 + 10922) >> 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
static DiracFrame *remove_frame(DiracFrame *framelist[], int picnum)
|
static DiracFrame *remove_frame(DiracFrame *framelist[], int picnum)
|
||||||
@@ -436,7 +436,7 @@ static av_cold int dirac_decode_end(AVCodecContext *avctx)
|
|||||||
static inline int coeff_unpack_golomb(GetBitContext *gb, int qfactor, int qoffset)
|
static inline int coeff_unpack_golomb(GetBitContext *gb, int qfactor, int qoffset)
|
||||||
{
|
{
|
||||||
int coeff = dirac_get_se_golomb(gb);
|
int coeff = dirac_get_se_golomb(gb);
|
||||||
const unsigned sign = FFSIGN(coeff);
|
const int sign = FFSIGN(coeff);
|
||||||
if (coeff)
|
if (coeff)
|
||||||
coeff = sign*((sign * coeff * qfactor + qoffset) >> 2);
|
coeff = sign*((sign * coeff * qfactor + qoffset) >> 2);
|
||||||
return coeff;
|
return coeff;
|
||||||
@@ -448,8 +448,7 @@ static inline int coeff_unpack_golomb(GetBitContext *gb, int qfactor, int qoffse
|
|||||||
static inline void coeff_unpack_arith_##n(DiracArith *c, int qfactor, int qoffset, \
|
static inline void coeff_unpack_arith_##n(DiracArith *c, int qfactor, int qoffset, \
|
||||||
SubBand *b, type *buf, int x, int y) \
|
SubBand *b, type *buf, int x, int y) \
|
||||||
{ \
|
{ \
|
||||||
int sign, sign_pred = 0, pred_ctx = CTX_ZPZN_F1; \
|
int coeff, sign, sign_pred = 0, pred_ctx = CTX_ZPZN_F1; \
|
||||||
unsigned coeff; \
|
|
||||||
const int mstride = -(b->stride >> (1+b->pshift)); \
|
const int mstride = -(b->stride >> (1+b->pshift)); \
|
||||||
if (b->parent) { \
|
if (b->parent) { \
|
||||||
const type *pbuf = (type *)b->parent->ibuf; \
|
const type *pbuf = (type *)b->parent->ibuf; \
|
||||||
@@ -502,16 +501,16 @@ static inline void codeblock(DiracContext *s, SubBand *b,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (s->codeblock_mode && !(s->old_delta_quant && blockcnt_one)) {
|
if (s->codeblock_mode && !(s->old_delta_quant && blockcnt_one)) {
|
||||||
int quant;
|
int quant = b->quant;
|
||||||
if (is_arith)
|
if (is_arith)
|
||||||
quant = dirac_get_arith_int(c, CTX_DELTA_Q_F, CTX_DELTA_Q_DATA);
|
quant += dirac_get_arith_int(c, CTX_DELTA_Q_F, CTX_DELTA_Q_DATA);
|
||||||
else
|
else
|
||||||
quant = dirac_get_se_golomb(gb);
|
quant += dirac_get_se_golomb(gb);
|
||||||
if (quant > INT_MAX - b->quant || b->quant + quant < 0) {
|
if (quant < 0) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "Invalid quant\n");
|
av_log(s->avctx, AV_LOG_ERROR, "Invalid quant\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
b->quant += quant;
|
b->quant = quant;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (b->quant > (DIRAC_MAX_QUANT_INDEX - 1)) {
|
if (b->quant > (DIRAC_MAX_QUANT_INDEX - 1)) {
|
||||||
@@ -580,7 +579,7 @@ static inline void codeblock(DiracContext *s, SubBand *b,
|
|||||||
} \
|
} \
|
||||||
|
|
||||||
INTRA_DC_PRED(8, int16_t)
|
INTRA_DC_PRED(8, int16_t)
|
||||||
INTRA_DC_PRED(10, uint32_t)
|
INTRA_DC_PRED(10, int32_t)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dirac Specification ->
|
* Dirac Specification ->
|
||||||
@@ -661,10 +660,6 @@ static void decode_component(DiracContext *s, int comp)
|
|||||||
b->length = get_interleaved_ue_golomb(&s->gb);
|
b->length = get_interleaved_ue_golomb(&s->gb);
|
||||||
if (b->length) {
|
if (b->length) {
|
||||||
b->quant = get_interleaved_ue_golomb(&s->gb);
|
b->quant = get_interleaved_ue_golomb(&s->gb);
|
||||||
if (b->quant > (DIRAC_MAX_QUANT_INDEX - 1)) {
|
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "Unsupported quant %d\n", b->quant);
|
|
||||||
b->quant = 0;
|
|
||||||
}
|
|
||||||
align_get_bits(&s->gb);
|
align_get_bits(&s->gb);
|
||||||
b->coeff_data = s->gb.buffer + get_bits_count(&s->gb)/8;
|
b->coeff_data = s->gb.buffer + get_bits_count(&s->gb)/8;
|
||||||
b->length = FFMIN(b->length, FFMAX(get_bits_left(&s->gb)/8, 0));
|
b->length = FFMIN(b->length, FFMAX(get_bits_left(&s->gb)/8, 0));
|
||||||
@@ -822,7 +817,7 @@ static int decode_hq_slice(DiracContext *s, DiracSlice *slice, uint8_t *tmp_buf)
|
|||||||
skip_bits_long(gb, 8*s->highquality.prefix_bytes);
|
skip_bits_long(gb, 8*s->highquality.prefix_bytes);
|
||||||
quant_idx = get_bits(gb, 8);
|
quant_idx = get_bits(gb, 8);
|
||||||
|
|
||||||
if (quant_idx > DIRAC_MAX_QUANT_INDEX - 1) {
|
if (quant_idx > DIRAC_MAX_QUANT_INDEX) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "Invalid quantization index - %i\n", quant_idx);
|
av_log(s->avctx, AV_LOG_ERROR, "Invalid quantization index - %i\n", quant_idx);
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
@@ -912,10 +907,9 @@ static int decode_lowdelay(DiracContext *s)
|
|||||||
int slice_num = 0;
|
int slice_num = 0;
|
||||||
|
|
||||||
if (s->slice_params_num_buf != (s->num_x * s->num_y)) {
|
if (s->slice_params_num_buf != (s->num_x * s->num_y)) {
|
||||||
s->slice_params_buf = av_realloc_f(s->slice_params_buf, s->num_x * s->num_y, sizeof(DiracSlice));
|
s->slice_params_buf = av_realloc_f(s->thread_buf, s->num_x * s->num_y, sizeof(DiracSlice));
|
||||||
if (!s->slice_params_buf) {
|
if (!s->slice_params_buf) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "slice params buffer allocation failure\n");
|
av_log(s->avctx, AV_LOG_ERROR, "slice params buffer allocation failure\n");
|
||||||
s->slice_params_num_buf = 0;
|
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
}
|
}
|
||||||
s->slice_params_num_buf = s->num_x * s->num_y;
|
s->slice_params_num_buf = s->num_x * s->num_y;
|
||||||
@@ -983,10 +977,6 @@ static int decode_lowdelay(DiracContext *s)
|
|||||||
for (slice_x = 0; bufsize > 0 && slice_x < s->num_x; slice_x++) {
|
for (slice_x = 0; bufsize > 0 && slice_x < s->num_x; slice_x++) {
|
||||||
bytes = (slice_num+1) * (int64_t)s->lowdelay.bytes.num / s->lowdelay.bytes.den
|
bytes = (slice_num+1) * (int64_t)s->lowdelay.bytes.num / s->lowdelay.bytes.den
|
||||||
- slice_num * (int64_t)s->lowdelay.bytes.num / s->lowdelay.bytes.den;
|
- slice_num * (int64_t)s->lowdelay.bytes.num / s->lowdelay.bytes.den;
|
||||||
if (bytes >= INT_MAX || bytes*8 > bufsize) {
|
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "too many bytes\n");
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
slices[slice_num].bytes = bytes;
|
slices[slice_num].bytes = bytes;
|
||||||
slices[slice_num].slice_x = slice_x;
|
slices[slice_num].slice_x = slice_x;
|
||||||
slices[slice_num].slice_y = slice_y;
|
slices[slice_num].slice_y = slice_y;
|
||||||
@@ -1163,10 +1153,6 @@ static int dirac_unpack_prediction_parameters(DiracContext *s)
|
|||||||
s->globalmc[ref].perspective[0] = dirac_get_se_golomb(gb);
|
s->globalmc[ref].perspective[0] = dirac_get_se_golomb(gb);
|
||||||
s->globalmc[ref].perspective[1] = dirac_get_se_golomb(gb);
|
s->globalmc[ref].perspective[1] = dirac_get_se_golomb(gb);
|
||||||
}
|
}
|
||||||
if (s->globalmc[ref].perspective_exp + (uint64_t)s->globalmc[ref].zrs_exp > 30) {
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1185,11 +1171,6 @@ static int dirac_unpack_prediction_parameters(DiracContext *s)
|
|||||||
|
|
||||||
if (get_bits1(gb)) {
|
if (get_bits1(gb)) {
|
||||||
s->weight_log2denom = get_interleaved_ue_golomb(gb);
|
s->weight_log2denom = get_interleaved_ue_golomb(gb);
|
||||||
if (s->weight_log2denom < 1 || s->weight_log2denom > 8) {
|
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "weight_log2denom unsupported or invalid\n");
|
|
||||||
s->weight_log2denom = 1;
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
s->weight[0] = dirac_get_se_golomb(gb);
|
s->weight[0] = dirac_get_se_golomb(gb);
|
||||||
if (s->num_refs == 2)
|
if (s->num_refs == 2)
|
||||||
s->weight[1] = dirac_get_se_golomb(gb);
|
s->weight[1] = dirac_get_se_golomb(gb);
|
||||||
@@ -1244,12 +1225,7 @@ static int dirac_unpack_idwt_params(DiracContext *s)
|
|||||||
else {
|
else {
|
||||||
s->num_x = get_interleaved_ue_golomb(gb);
|
s->num_x = get_interleaved_ue_golomb(gb);
|
||||||
s->num_y = get_interleaved_ue_golomb(gb);
|
s->num_y = get_interleaved_ue_golomb(gb);
|
||||||
if (s->num_x * s->num_y == 0 || s->num_x * (uint64_t)s->num_y > INT_MAX ||
|
if (s->num_x * s->num_y == 0 || s->num_x * (uint64_t)s->num_y > INT_MAX) {
|
||||||
s->num_x * (uint64_t)s->avctx->width > INT_MAX ||
|
|
||||||
s->num_y * (uint64_t)s->avctx->height > INT_MAX ||
|
|
||||||
s->num_x > s->avctx->width ||
|
|
||||||
s->num_y > s->avctx->height
|
|
||||||
) {
|
|
||||||
av_log(s->avctx,AV_LOG_ERROR,"Invalid numx/y\n");
|
av_log(s->avctx,AV_LOG_ERROR,"Invalid numx/y\n");
|
||||||
s->num_x = s->num_y = 0;
|
s->num_x = s->num_y = 0;
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
@@ -1405,9 +1381,9 @@ static void global_mv(DiracContext *s, DiracBlock *block, int x, int y, int ref)
|
|||||||
int *b = s->globalmc[ref].pan_tilt;
|
int *b = s->globalmc[ref].pan_tilt;
|
||||||
int *c = s->globalmc[ref].perspective;
|
int *c = s->globalmc[ref].perspective;
|
||||||
|
|
||||||
int64_t m = (1<<ep) - (c[0]*(int64_t)x + c[1]*(int64_t)y);
|
int m = (1<<ep) - (c[0]*x + c[1]*y);
|
||||||
int64_t mx = m * (uint64_t)((A[0][0] * (int64_t)x + A[0][1]*(int64_t)y) + (1LL<<ez) * b[0]);
|
int mx = m * ((A[0][0] * x + A[0][1]*y) + (1<<ez) * b[0]);
|
||||||
int64_t my = m * (uint64_t)((A[1][0] * (int64_t)x + A[1][1]*(int64_t)y) + (1LL<<ez) * b[1]);
|
int my = m * ((A[1][0] * x + A[1][1]*y) + (1<<ez) * b[1]);
|
||||||
|
|
||||||
block->u.mv[ref][0] = (mx + (1<<(ez+ep))) >> (ez+ep);
|
block->u.mv[ref][0] = (mx + (1<<(ez+ep))) >> (ez+ep);
|
||||||
block->u.mv[ref][1] = (my + (1<<(ez+ep))) >> (ez+ep);
|
block->u.mv[ref][1] = (my + (1<<(ez+ep))) >> (ez+ep);
|
||||||
@@ -1429,7 +1405,7 @@ static void decode_block_params(DiracContext *s, DiracArith arith[8], DiracBlock
|
|||||||
if (!block->ref) {
|
if (!block->ref) {
|
||||||
pred_block_dc(block, stride, x, y);
|
pred_block_dc(block, stride, x, y);
|
||||||
for (i = 0; i < 3; i++)
|
for (i = 0; i < 3; i++)
|
||||||
block->u.dc[i] += (unsigned)dirac_get_arith_int(arith+1+i, CTX_DC_F1, CTX_DC_DATA);
|
block->u.dc[i] += dirac_get_arith_int(arith+1+i, CTX_DC_F1, CTX_DC_DATA);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1444,8 +1420,8 @@ static void decode_block_params(DiracContext *s, DiracArith arith[8], DiracBlock
|
|||||||
global_mv(s, block, x, y, i);
|
global_mv(s, block, x, y, i);
|
||||||
} else {
|
} else {
|
||||||
pred_mv(block, stride, x, y, i);
|
pred_mv(block, stride, x, y, i);
|
||||||
block->u.mv[i][0] += (unsigned)dirac_get_arith_int(arith + 4 + 2 * i, CTX_MV_F1, CTX_MV_DATA);
|
block->u.mv[i][0] += dirac_get_arith_int(arith + 4 + 2 * i, CTX_MV_F1, CTX_MV_DATA);
|
||||||
block->u.mv[i][1] += (unsigned)dirac_get_arith_int(arith + 5 + 2 * i, CTX_MV_F1, CTX_MV_DATA);
|
block->u.mv[i][1] += dirac_get_arith_int(arith + 5 + 2 * i, CTX_MV_F1, CTX_MV_DATA);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1998,9 +1974,7 @@ static int dirac_decode_picture_header(DiracContext *s)
|
|||||||
for (j = 0; j < MAX_FRAMES; j++)
|
for (j = 0; j < MAX_FRAMES; j++)
|
||||||
if (!s->all_frames[j].avframe->data[0]) {
|
if (!s->all_frames[j].avframe->data[0]) {
|
||||||
s->ref_pics[i] = &s->all_frames[j];
|
s->ref_pics[i] = &s->all_frames[j];
|
||||||
ret = get_buffer_with_edge(s->avctx, s->ref_pics[i]->avframe, AV_GET_BUFFER_FLAG_REF);
|
get_buffer_with_edge(s->avctx, s->ref_pics[i]->avframe, AV_GET_BUFFER_FLAG_REF);
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2064,9 +2038,9 @@ static int get_delayed_pic(DiracContext *s, AVFrame *picture, int *got_frame)
|
|||||||
|
|
||||||
if (out) {
|
if (out) {
|
||||||
out->reference ^= DELAYED_PIC_REF;
|
out->reference ^= DELAYED_PIC_REF;
|
||||||
|
*got_frame = 1;
|
||||||
if((ret = av_frame_ref(picture, out->avframe)) < 0)
|
if((ret = av_frame_ref(picture, out->avframe)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
*got_frame = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -2307,7 +2281,7 @@ static int dirac_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (*got_frame)
|
if (*got_frame)
|
||||||
s->frame_number = picture->display_picture_number + 1LL;
|
s->frame_number = picture->display_picture_number + 1;
|
||||||
|
|
||||||
return buf_idx;
|
return buf_idx;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -159,10 +159,10 @@ static void put_signed_rect_clamped_ ## PX ## bit_c(uint8_t *_dst, int dst_strid
|
|||||||
int32_t *src = (int32_t *)_src; \
|
int32_t *src = (int32_t *)_src; \
|
||||||
for (y = 0; y < height; y++) { \
|
for (y = 0; y < height; y++) { \
|
||||||
for (x = 0; x < width; x+=4) { \
|
for (x = 0; x < width; x+=4) { \
|
||||||
dst[x ] = av_clip_uintp2(src[x ] + (1U << (PX - 1)), PX); \
|
dst[x ] = av_clip_uintp2(src[x ] + (1 << (PX - 1)), PX); \
|
||||||
dst[x+1] = av_clip_uintp2(src[x+1] + (1U << (PX - 1)), PX); \
|
dst[x+1] = av_clip_uintp2(src[x+1] + (1 << (PX - 1)), PX); \
|
||||||
dst[x+2] = av_clip_uintp2(src[x+2] + (1U << (PX - 1)), PX); \
|
dst[x+2] = av_clip_uintp2(src[x+2] + (1 << (PX - 1)), PX); \
|
||||||
dst[x+3] = av_clip_uintp2(src[x+3] + (1U << (PX - 1)), PX); \
|
dst[x+3] = av_clip_uintp2(src[x+3] + (1 << (PX - 1)), PX); \
|
||||||
} \
|
} \
|
||||||
dst += dst_stride >> 1; \
|
dst += dst_stride >> 1; \
|
||||||
src += src_stride >> 2; \
|
src += src_stride >> 2; \
|
||||||
@@ -198,9 +198,9 @@ static void dequant_subband_ ## PX ## _c(uint8_t *src, uint8_t *dst, ptrdiff_t s
|
|||||||
PX c, sign, *src_r = (PX *)src, *dst_r = (PX *)dst; \
|
PX c, sign, *src_r = (PX *)src, *dst_r = (PX *)dst; \
|
||||||
for (i = 0; i < tot_h; i++) { \
|
for (i = 0; i < tot_h; i++) { \
|
||||||
c = *src_r++; \
|
c = *src_r++; \
|
||||||
if (c < 0) c = -((-(unsigned)c*qf + qs) >> 2); \
|
sign = FFSIGN(c)*(!!c); \
|
||||||
else if(c > 0) c = (( (unsigned)c*qf + qs) >> 2); \
|
c = (FFABS(c)*qf + qs) >> 2; \
|
||||||
*dst_r++ = c; \
|
*dst_r++ = c*sign; \
|
||||||
} \
|
} \
|
||||||
src += tot_h << (sizeof(PX) >> 1); \
|
src += tot_h << (sizeof(PX) >> 1); \
|
||||||
dst += stride; \
|
dst += stride; \
|
||||||
|
|||||||
@@ -31,24 +31,8 @@ typedef struct {
|
|||||||
ParseContext pc;
|
ParseContext pc;
|
||||||
int interlaced;
|
int interlaced;
|
||||||
int cur_field; /* first field is 0, second is 1 */
|
int cur_field; /* first field is 0, second is 1 */
|
||||||
int cur_byte;
|
|
||||||
int remaining;
|
|
||||||
int w, h;
|
|
||||||
} DNXHDParserContext;
|
} DNXHDParserContext;
|
||||||
|
|
||||||
static int dnxhd_get_hr_frame_size(int cid, int w, int h)
|
|
||||||
{
|
|
||||||
int result, i = ff_dnxhd_get_cid_table(cid);
|
|
||||||
|
|
||||||
if (i < 0)
|
|
||||||
return i;
|
|
||||||
|
|
||||||
result = ((h + 15) / 16) * ((w + 15) / 16) * ff_dnxhd_cid_table[i].packet_scale.num / ff_dnxhd_cid_table[i].packet_scale.den;
|
|
||||||
result = (result + 2048) / 4096 * 4096;
|
|
||||||
|
|
||||||
return FFMAX(result, 8192);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dnxhd_find_frame_end(DNXHDParserContext *dctx,
|
static int dnxhd_find_frame_end(DNXHDParserContext *dctx,
|
||||||
const uint8_t *buf, int buf_size)
|
const uint8_t *buf, int buf_size)
|
||||||
{
|
{
|
||||||
@@ -67,67 +51,30 @@ static int dnxhd_find_frame_end(DNXHDParserContext *dctx,
|
|||||||
pic_found = 1;
|
pic_found = 1;
|
||||||
interlaced = (state&2)>>1; /* byte following the 5-byte header prefix */
|
interlaced = (state&2)>>1; /* byte following the 5-byte header prefix */
|
||||||
cur_field = state&1;
|
cur_field = state&1;
|
||||||
dctx->cur_byte = 0;
|
|
||||||
dctx->remaining = 0;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pic_found && !dctx->remaining) {
|
if (pic_found) {
|
||||||
if (!buf_size) /* EOF considered as end of frame */
|
if (!buf_size) /* EOF considered as end of frame */
|
||||||
return 0;
|
return 0;
|
||||||
for (; i < buf_size; i++) {
|
for (; i < buf_size; i++) {
|
||||||
dctx->cur_byte++;
|
|
||||||
state = (state << 8) | buf[i];
|
state = (state << 8) | buf[i];
|
||||||
|
if (ff_dnxhd_check_header_prefix(state & 0xffffffffff00LL) != 0) {
|
||||||
if (dctx->cur_byte == 24) {
|
if (!interlaced || dctx->cur_field) {
|
||||||
dctx->h = (state >> 32) & 0xFFFF;
|
|
||||||
} else if (dctx->cur_byte == 26) {
|
|
||||||
dctx->w = (state >> 32) & 0xFFFF;
|
|
||||||
} else if (dctx->cur_byte == 42) {
|
|
||||||
int cid = (state >> 32) & 0xFFFFFFFF;
|
|
||||||
int remaining;
|
|
||||||
|
|
||||||
if (cid <= 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
remaining = avpriv_dnxhd_get_frame_size(cid);
|
|
||||||
if (remaining <= 0) {
|
|
||||||
remaining = dnxhd_get_hr_frame_size(cid, dctx->w, dctx->h);
|
|
||||||
if (remaining <= 0)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
dctx->remaining = remaining;
|
|
||||||
if (buf_size - i >= dctx->remaining && (!dctx->interlaced || dctx->cur_field)) {
|
|
||||||
int remaining = dctx->remaining;
|
|
||||||
|
|
||||||
pc->frame_start_found = 0;
|
pc->frame_start_found = 0;
|
||||||
pc->state64 = -1;
|
pc->state64 = -1;
|
||||||
dctx->interlaced = interlaced;
|
dctx->interlaced = interlaced;
|
||||||
dctx->cur_field = 0;
|
dctx->cur_field = 0;
|
||||||
dctx->cur_byte = 0;
|
return i - 5;
|
||||||
dctx->remaining = 0;
|
|
||||||
return remaining;
|
|
||||||
} else {
|
} else {
|
||||||
dctx->remaining -= buf_size;
|
/* continue, to get the second field */
|
||||||
|
dctx->interlaced = interlaced = (state&2)>>1;
|
||||||
|
dctx->cur_field = cur_field = state&1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (pic_found) {
|
|
||||||
if (dctx->remaining > buf_size) {
|
|
||||||
dctx->remaining -= buf_size;
|
|
||||||
} else {
|
|
||||||
int remaining = dctx->remaining;
|
|
||||||
|
|
||||||
pc->frame_start_found = 0;
|
|
||||||
pc->state64 = -1;
|
|
||||||
dctx->interlaced = interlaced;
|
|
||||||
dctx->cur_field = 0;
|
|
||||||
dctx->cur_byte = 0;
|
|
||||||
dctx->remaining = 0;
|
|
||||||
return remaining;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
pc->frame_start_found = pic_found;
|
pc->frame_start_found = pic_found;
|
||||||
pc->state64 = state;
|
pc->state64 = state;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user