Merge remote-tracking branch 'newdev/master'
Conflicts: Changelog doc/APIchanges doc/optimization.txt libavformat/avio.h Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
0fecf2642b
2
CREDITS
2
CREDITS
@ -1,5 +1,5 @@
|
|||||||
This file contains the names of some of the people who have contributed to
|
This file contains the names of some of the people who have contributed to
|
||||||
FFmpeg. The names are sorted alphabetically by last name. As this file is
|
Libav/FFmpeg. The names are sorted alphabetically by last name. As this file is
|
||||||
currently quite outdated and git serves as a much better tool for determining
|
currently quite outdated and git serves as a much better tool for determining
|
||||||
authorship, it remains here for historical reasons only.
|
authorship, it remains here for historical reasons only.
|
||||||
|
|
||||||
|
@ -79,6 +79,7 @@ version <next>:
|
|||||||
- Bink version 'b' audio and video decoder
|
- Bink version 'b' audio and video decoder
|
||||||
- Bitmap Brothers JV playback system
|
- Bitmap Brothers JV playback system
|
||||||
- Linux framebuffer input device added
|
- Linux framebuffer input device added
|
||||||
|
- Apple HTTP Live Streaming protocol handler
|
||||||
|
|
||||||
|
|
||||||
version 0.6:
|
version 0.6:
|
||||||
|
2
Doxyfile
2
Doxyfile
@ -25,7 +25,7 @@ DOXYFILE_ENCODING = UTF-8
|
|||||||
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
|
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
|
||||||
# by quotes) that should identify the project.
|
# by quotes) that should identify the project.
|
||||||
|
|
||||||
PROJECT_NAME = FFmpeg
|
PROJECT_NAME = Libav
|
||||||
|
|
||||||
# The PROJECT_NUMBER tag can be used to enter a project or revision number.
|
# The PROJECT_NUMBER tag can be used to enter a project or revision number.
|
||||||
# This could be handy for archiving the generated documentation or
|
# This could be handy for archiving the generated documentation or
|
||||||
|
6
INSTALL
6
INSTALL
@ -2,10 +2,10 @@
|
|||||||
1) Type './configure' to create the configuration. A list of configure
|
1) Type './configure' to create the configuration. A list of configure
|
||||||
options is printed by running 'configure --help'.
|
options is printed by running 'configure --help'.
|
||||||
|
|
||||||
'configure' can be launched from a directory different from the FFmpeg
|
'configure' can be launched from a directory different from the Libav
|
||||||
sources to build the objects out of tree. To do this, use an absolute
|
sources to build the objects out of tree. To do this, use an absolute
|
||||||
path when launching 'configure', e.g. '/ffmpegdir/ffmpeg/configure'.
|
path when launching 'configure', e.g. '/libavdir/libav/configure'.
|
||||||
|
|
||||||
2) Then type 'make' to build FFmpeg. GNU Make 3.81 or later is required.
|
2) Then type 'make' to build Libav. GNU Make 3.81 or later is required.
|
||||||
|
|
||||||
3) Type 'make install' to install all binaries and libraries you built.
|
3) Type 'make install' to install all binaries and libraries you built.
|
||||||
|
20
LICENSE
20
LICENSE
@ -1,17 +1,17 @@
|
|||||||
FFmpeg:
|
Libav:
|
||||||
-------
|
-------
|
||||||
|
|
||||||
Most files in FFmpeg are under the GNU Lesser General Public License version 2.1
|
Most files in Libav are under the GNU Lesser General Public License version 2.1
|
||||||
or later (LGPL v2.1+). Read the file COPYING.LGPLv2.1 for details. Some other
|
or later (LGPL v2.1+). Read the file COPYING.LGPLv2.1 for details. Some other
|
||||||
files have MIT/X11/BSD-style licenses. In combination the LGPL v2.1+ applies to
|
files have MIT/X11/BSD-style licenses. In combination the LGPL v2.1+ applies to
|
||||||
FFmpeg.
|
Libav.
|
||||||
|
|
||||||
Some optional parts of FFmpeg are licensed under the GNU General Public License
|
Some optional parts of Libav are licensed under the GNU General Public License
|
||||||
version 2 or later (GPL v2+). See the file COPYING.GPLv2 for details. None of
|
version 2 or later (GPL v2+). See the file COPYING.GPLv2 for details. None of
|
||||||
these parts are used by default, you have to explicitly pass --enable-gpl to
|
these parts are used by default, you have to explicitly pass --enable-gpl to
|
||||||
configure to activate them. In this case, FFmpeg's license changes to GPL v2+.
|
configure to activate them. In this case, Libav's license changes to GPL v2+.
|
||||||
|
|
||||||
Specifically, the GPL parts of FFmpeg are
|
Specifically, the GPL parts of Libav are
|
||||||
|
|
||||||
- libpostproc
|
- libpostproc
|
||||||
- optional x86 optimizations in the files
|
- optional x86 optimizations in the files
|
||||||
@ -33,14 +33,14 @@ external libraries:
|
|||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
Some external libraries, e.g. libx264, are under GPL and can be used in
|
Some external libraries, e.g. libx264, are under GPL and can be used in
|
||||||
conjunction with FFmpeg. They require --enable-gpl to be passed to configure
|
conjunction with Libav. They require --enable-gpl to be passed to configure
|
||||||
as well.
|
as well.
|
||||||
|
|
||||||
The OpenCORE external libraries are under the Apache License 2.0. That license
|
The OpenCORE external libraries are under the Apache License 2.0. That license
|
||||||
is incompatible with the LGPL v2.1 and the GPL v2, but not with version 3 of
|
is incompatible with the LGPL v2.1 and the GPL v2, but not with version 3 of
|
||||||
those licenses. So to combine the OpenCORE libraries with FFmpeg, the license
|
those licenses. So to combine the OpenCORE libraries with Libav, the license
|
||||||
version needs to be upgraded by passing --enable-version3 to configure.
|
version needs to be upgraded by passing --enable-version3 to configure.
|
||||||
|
|
||||||
The nonfree external library libfaac can be hooked up in FFmpeg. You need to
|
The nonfree external library libfaac can be hooked up in Libav. You need to
|
||||||
pass --enable-nonfree to configure to enable it. Employ this option with care
|
pass --enable-nonfree to configure to enable it. Employ this option with care
|
||||||
as FFmpeg then becomes nonfree and unredistributable.
|
as Libav then becomes nonfree and unredistributable.
|
||||||
|
2
Makefile
2
Makefile
@ -177,7 +177,7 @@ distclean::
|
|||||||
$(RM) version.h config.* libavutil/avconfig.h
|
$(RM) version.h config.* libavutil/avconfig.h
|
||||||
|
|
||||||
config:
|
config:
|
||||||
$(SRC_PATH)/configure $(value FFMPEG_CONFIGURATION)
|
$(SRC_PATH)/configure $(value LIBAV_CONFIGURATION)
|
||||||
|
|
||||||
# regression tests
|
# regression tests
|
||||||
|
|
||||||
|
2
README
2
README
@ -1,4 +1,4 @@
|
|||||||
FFmpeg README
|
Libav README
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
1) Documentation
|
1) Documentation
|
||||||
|
@ -399,7 +399,7 @@ static int warned_cfg = 0;
|
|||||||
} \
|
} \
|
||||||
if (flags & SHOW_CONFIG) { \
|
if (flags & SHOW_CONFIG) { \
|
||||||
const char *cfg = libname##_configuration(); \
|
const char *cfg = libname##_configuration(); \
|
||||||
if (strcmp(FFMPEG_CONFIGURATION, cfg)) { \
|
if (strcmp(LIBAV_CONFIGURATION, cfg)) { \
|
||||||
if (!warned_cfg) { \
|
if (!warned_cfg) { \
|
||||||
fprintf(outstream, \
|
fprintf(outstream, \
|
||||||
"%sWARNING: library configuration mismatch\n", \
|
"%sWARNING: library configuration mismatch\n", \
|
||||||
@ -425,17 +425,17 @@ static void print_all_libs_info(FILE* outstream, int flags)
|
|||||||
|
|
||||||
void show_banner(void)
|
void show_banner(void)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-%d the FFmpeg developers\n",
|
fprintf(stderr, "%s version " LIBAV_VERSION ", Copyright (c) %d-%d the Libav developers\n",
|
||||||
program_name, program_birth_year, this_year);
|
program_name, program_birth_year, this_year);
|
||||||
fprintf(stderr, " built on %s %s with %s %s\n",
|
fprintf(stderr, " built on %s %s with %s %s\n",
|
||||||
__DATE__, __TIME__, CC_TYPE, CC_VERSION);
|
__DATE__, __TIME__, CC_TYPE, CC_VERSION);
|
||||||
fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n");
|
fprintf(stderr, " configuration: " LIBAV_CONFIGURATION "\n");
|
||||||
print_all_libs_info(stderr, INDENT|SHOW_CONFIG);
|
print_all_libs_info(stderr, INDENT|SHOW_CONFIG);
|
||||||
print_all_libs_info(stderr, INDENT|SHOW_VERSION);
|
print_all_libs_info(stderr, INDENT|SHOW_VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_version(void) {
|
void show_version(void) {
|
||||||
printf("%s " FFMPEG_VERSION "\n", program_name);
|
printf("%s " LIBAV_VERSION "\n", program_name);
|
||||||
print_all_libs_info(stdout, SHOW_VERSION);
|
print_all_libs_info(stdout, SHOW_VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
53
configure
vendored
53
configure
vendored
@ -1,6 +1,6 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
#
|
#
|
||||||
# FFmpeg configure script
|
# Libav configure script
|
||||||
#
|
#
|
||||||
# Copyright (c) 2000-2002 Fabrice Bellard
|
# Copyright (c) 2000-2002 Fabrice Bellard
|
||||||
# Copyright (c) 2005-2008 Diego Biurrun
|
# Copyright (c) 2005-2008 Diego Biurrun
|
||||||
@ -44,9 +44,9 @@ if test "$E1" != 0 || test "$E2" = 0; then
|
|||||||
echo "No compatible shell script interpreter found."
|
echo "No compatible shell script interpreter found."
|
||||||
echo "This configure script requires a POSIX-compatible shell"
|
echo "This configure script requires a POSIX-compatible shell"
|
||||||
echo "such as bash or ksh."
|
echo "such as bash or ksh."
|
||||||
echo "THIS IS NOT A BUG IN FFMPEG, DO NOT REPORT IT AS SUCH."
|
echo "THIS IS NOT A BUG IN LIBAV, DO NOT REPORT IT AS SUCH."
|
||||||
echo "Instead, install a working POSIX-compatible shell."
|
echo "Instead, install a working POSIX-compatible shell."
|
||||||
echo "Disabling this configure test will create a broken FFmpeg."
|
echo "Disabling this configure test will create a broken Libav."
|
||||||
if test "$BASH_VERSION" = '2.04.0(1)-release'; then
|
if test "$BASH_VERSION" = '2.04.0(1)-release'; then
|
||||||
echo "This bash version ($BASH_VERSION) is broken on your platform."
|
echo "This bash version ($BASH_VERSION) is broken on your platform."
|
||||||
echo "Upgrade to a later version if available."
|
echo "Upgrade to a later version if available."
|
||||||
@ -238,7 +238,7 @@ Advanced options (experts only):
|
|||||||
--enable-sram allow use of on-chip SRAM
|
--enable-sram allow use of on-chip SRAM
|
||||||
--disable-symver disable symbol versioning
|
--disable-symver disable symbol versioning
|
||||||
|
|
||||||
Developer options (useful when working on FFmpeg itself):
|
Developer options (useful when working on Libav itself):
|
||||||
--disable-debug disable debugging symbols
|
--disable-debug disable debugging symbols
|
||||||
--enable-debug=LEVEL set the debug level [$debuglevel]
|
--enable-debug=LEVEL set the debug level [$debuglevel]
|
||||||
--disable-optimizations disable compiler optimizations
|
--disable-optimizations disable compiler optimizations
|
||||||
@ -280,7 +280,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@mplayerhq.hu mailing list or IRC #ffmpeg on irc.freenode.net.
|
libav-user@libav.org mailing list or IRC #libav on irc.freenode.net.
|
||||||
EOF
|
EOF
|
||||||
if disabled logging; then
|
if disabled logging; then
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
@ -1672,7 +1672,7 @@ for v in "$@"; do
|
|||||||
r=${v#*=}
|
r=${v#*=}
|
||||||
l=${v%"$r"}
|
l=${v%"$r"}
|
||||||
r=$(sh_quote "$r")
|
r=$(sh_quote "$r")
|
||||||
FFMPEG_CONFIGURATION="${FFMPEG_CONFIGURATION# } ${l}${r}"
|
LIBAV_CONFIGURATION="${LIBAV_CONFIGURATION# } ${l}${r}"
|
||||||
done
|
done
|
||||||
|
|
||||||
find_things(){
|
find_things(){
|
||||||
@ -1784,7 +1784,7 @@ done
|
|||||||
|
|
||||||
disabled logging && logfile=/dev/null
|
disabled logging && logfile=/dev/null
|
||||||
|
|
||||||
echo "# $0 $FFMPEG_CONFIGURATION" > $logfile
|
echo "# $0 $LIBAV_CONFIGURATION" > $logfile
|
||||||
set >> $logfile
|
set >> $logfile
|
||||||
|
|
||||||
test -n "$cross_prefix" && enable cross_compile
|
test -n "$cross_prefix" && enable cross_compile
|
||||||
@ -2344,7 +2344,7 @@ case $target_os in
|
|||||||
openbsd)
|
openbsd)
|
||||||
enable malloc_aligned
|
enable malloc_aligned
|
||||||
# On OpenBSD 4.5. the compiler does not use PIC unless
|
# On OpenBSD 4.5. the compiler does not use PIC unless
|
||||||
# explicitly using -fPIC. FFmpeg builds fine without PIC,
|
# explicitly using -fPIC. Libav builds fine without PIC,
|
||||||
# however the generated executable will not do anything
|
# however the generated executable will not do anything
|
||||||
# (simply quits with exit-code 1, no crash, no output).
|
# (simply quits with exit-code 1, no crash, no output).
|
||||||
# Thus explicitly enable PIC here.
|
# Thus explicitly enable PIC here.
|
||||||
@ -2369,7 +2369,8 @@ case $target_os in
|
|||||||
enable malloc_aligned
|
enable malloc_aligned
|
||||||
gas="gas-preprocessor.pl $cc"
|
gas="gas-preprocessor.pl $cc"
|
||||||
enabled ppc && add_asflags -force_cpusubtype_ALL
|
enabled ppc && add_asflags -force_cpusubtype_ALL
|
||||||
SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR) -Wl,-read_only_relocs,suppress'
|
SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)'
|
||||||
|
enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress
|
||||||
strip="${strip} -x"
|
strip="${strip} -x"
|
||||||
add_ldflags -Wl,-dynamic,-search_paths_first
|
add_ldflags -Wl,-dynamic,-search_paths_first
|
||||||
SLIBSUF=".dylib"
|
SLIBSUF=".dylib"
|
||||||
@ -2478,7 +2479,7 @@ case $target_os in
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
echo "config:$arch:$subarch:$cpu:$target_os:$cc_ident:$FFMPEG_CONFIGURATION" >config.fate
|
echo "config:$arch:$subarch:$cpu:$target_os:$cc_ident:$LIBAV_CONFIGURATION" >config.fate
|
||||||
|
|
||||||
check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable pic
|
check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable pic
|
||||||
|
|
||||||
@ -3201,9 +3202,9 @@ config_files="$TMPH config.mak"
|
|||||||
|
|
||||||
cat > config.mak <<EOF
|
cat > config.mak <<EOF
|
||||||
# Automatically generated by configure - do not modify!
|
# Automatically generated by configure - do not modify!
|
||||||
ifndef FFMPEG_CONFIG_MAK
|
ifndef LIBAV_CONFIG_MAK
|
||||||
FFMPEG_CONFIG_MAK=1
|
LIBAV_CONFIG_MAK=1
|
||||||
FFMPEG_CONFIGURATION=$FFMPEG_CONFIGURATION
|
LIBAV_CONFIGURATION=$LIBAV_CONFIGURATION
|
||||||
prefix=$prefix
|
prefix=$prefix
|
||||||
LIBDIR=\$(DESTDIR)$libdir
|
LIBDIR=\$(DESTDIR)$libdir
|
||||||
SHLIBDIR=\$(DESTDIR)$shlibdir
|
SHLIBDIR=\$(DESTDIR)$shlibdir
|
||||||
@ -3292,10 +3293,10 @@ get_version LIBAVFILTER libavfilter/avfilter.h
|
|||||||
|
|
||||||
cat > $TMPH <<EOF
|
cat > $TMPH <<EOF
|
||||||
/* Automatically generated by configure - do not modify! */
|
/* Automatically generated by configure - do not modify! */
|
||||||
#ifndef FFMPEG_CONFIG_H
|
#ifndef LIBAV_CONFIG_H
|
||||||
#define FFMPEG_CONFIG_H
|
#define LIBAV_CONFIG_H
|
||||||
#define FFMPEG_CONFIGURATION "$(c_escape $FFMPEG_CONFIGURATION)"
|
#define LIBAV_CONFIGURATION "$(c_escape $LIBAV_CONFIGURATION)"
|
||||||
#define FFMPEG_LICENSE "$(c_escape $license)"
|
#define LIBAV_LICENSE "$(c_escape $license)"
|
||||||
#define FFMPEG_DATADIR "$(eval c_escape $datadir)"
|
#define FFMPEG_DATADIR "$(eval c_escape $datadir)"
|
||||||
#define CC_TYPE "$cc_type"
|
#define CC_TYPE "$cc_type"
|
||||||
#define CC_VERSION $cc_version
|
#define CC_VERSION $cc_version
|
||||||
@ -3346,8 +3347,8 @@ LAVFI_TESTS=$(print_enabled -n _test $LAVFI_TESTS)
|
|||||||
SEEK_TESTS=$(print_enabled -n _test $SEEK_TESTS)
|
SEEK_TESTS=$(print_enabled -n _test $SEEK_TESTS)
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
echo "#endif /* FFMPEG_CONFIG_H */" >> $TMPH
|
echo "#endif /* LIBAV_CONFIG_H */" >> $TMPH
|
||||||
echo "endif # FFMPEG_CONFIG_MAK" >> config.mak
|
echo "endif # LIBAV_CONFIG_MAK" >> config.mak
|
||||||
|
|
||||||
# Do not overwrite an unchanged config.h to avoid superfluous rebuilds.
|
# Do not overwrite an unchanged config.h to avoid superfluous rebuilds.
|
||||||
cp_if_changed $TMPH config.h
|
cp_if_changed $TMPH config.h
|
||||||
@ -3411,10 +3412,10 @@ Cflags: -I\${includedir}
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
pkgconfig_generate libavutil "FFmpeg utility library" "$LIBAVUTIL_VERSION"
|
pkgconfig_generate libavutil "Libav utility library" "$LIBAVUTIL_VERSION"
|
||||||
pkgconfig_generate libavcodec "FFmpeg codec library" "$LIBAVCODEC_VERSION" "$extralibs"
|
pkgconfig_generate libavcodec "Libav codec library" "$LIBAVCODEC_VERSION" "$extralibs"
|
||||||
pkgconfig_generate libavformat "FFmpeg container format library" "$LIBAVFORMAT_VERSION" "$extralibs" "libavcodec = $LIBAVCODEC_VERSION"
|
pkgconfig_generate libavformat "Libav container format library" "$LIBAVFORMAT_VERSION" "$extralibs" "libavcodec = $LIBAVCODEC_VERSION"
|
||||||
pkgconfig_generate libavdevice "FFmpeg device handling library" "$LIBAVDEVICE_VERSION" "$extralibs" "libavformat = $LIBAVFORMAT_VERSION"
|
pkgconfig_generate libavdevice "Libav device handling library" "$LIBAVDEVICE_VERSION" "$extralibs" "libavformat = $LIBAVFORMAT_VERSION"
|
||||||
pkgconfig_generate libavfilter "FFmpeg video filtering library" "$LIBAVFILTER_VERSION" "$extralibs"
|
pkgconfig_generate libavfilter "Libav video filtering library" "$LIBAVFILTER_VERSION" "$extralibs"
|
||||||
pkgconfig_generate libpostproc "FFmpeg post processing library" "$LIBPOSTPROC_VERSION"
|
pkgconfig_generate libpostproc "Libav post processing library" "$LIBPOSTPROC_VERSION"
|
||||||
pkgconfig_generate libswscale "FFmpeg image rescaling library" "$LIBSWSCALE_VERSION" "" "libavutil = $LIBAVUTIL_VERSION"
|
pkgconfig_generate libswscale "Libav image rescaling library" "$LIBSWSCALE_VERSION" "" "libavutil = $LIBAVUTIL_VERSION"
|
||||||
|
@ -15,6 +15,11 @@ API changes, most recent first:
|
|||||||
2011-XX-XX - XXXXXXX - lavu XX.XXX.X - pixfmt.h
|
2011-XX-XX - XXXXXXX - lavu XX.XXX.X - pixfmt.h
|
||||||
Add PIX_FMT_BGR48LE and PIX_FMT_BGR48BE pixel formats
|
Add PIX_FMT_BGR48LE and PIX_FMT_BGR48BE pixel formats
|
||||||
|
|
||||||
|
2011-03-02 - 863c471 - lavf 52.103.0 - av_pkt_dump2, av_pkt_dump_log2
|
||||||
|
Add new functions av_pkt_dump2, av_pkt_dump_log2 that uses the
|
||||||
|
source stream timebase for outputting timestamps. Deprecate
|
||||||
|
av_pkt_dump and av_pkt_dump_log.
|
||||||
|
|
||||||
2011-02-20 - e731b8d - lavf 52.102.0 - avio.h
|
2011-02-20 - e731b8d - lavf 52.102.0 - avio.h
|
||||||
* e731b8d - rename init_put_byte() to ffio_init_context(), deprecating the
|
* e731b8d - rename init_put_byte() to ffio_init_context(), deprecating the
|
||||||
original, and move it to a private header so it is no longer
|
original, and move it to a private header so it is no longer
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
@chapter Bitstream Filters
|
@chapter Bitstream Filters
|
||||||
@c man begin BITSTREAM FILTERS
|
@c man begin BITSTREAM FILTERS
|
||||||
|
|
||||||
When you configure your FFmpeg build, all the supported bitstream
|
When you configure your Libav build, all the supported bitstream
|
||||||
filters are enabled by default. You can list all available ones using
|
filters are enabled by default. You can list all available ones using
|
||||||
the configure option @code{--list-bsfs}.
|
the configure option @code{--list-bsfs}.
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
FFmpeg currently uses a custom build system, this text attempts to document
|
Libav currently uses a custom build system, this text attempts to document
|
||||||
some of its obscure features and options.
|
some of its obscure features and options.
|
||||||
|
|
||||||
Options to make:
|
Options to make:
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
@chapter Demuxers
|
@chapter Demuxers
|
||||||
@c man begin DEMUXERS
|
@c man begin DEMUXERS
|
||||||
|
|
||||||
Demuxers are configured elements in FFmpeg which allow to read the
|
Demuxers are configured elements in Libav which allow to read the
|
||||||
multimedia streams from a particular type of file.
|
multimedia streams from a particular type of file.
|
||||||
|
|
||||||
When you configure your FFmpeg build, all the supported demuxers
|
When you configure your Libav build, all the supported demuxers
|
||||||
are enabled by default. You can list all available ones using the
|
are enabled by default. You can list all available ones using the
|
||||||
configure option "--list-demuxers".
|
configure option "--list-demuxers".
|
||||||
|
|
||||||
|
@ -32,12 +32,12 @@ generated by ./configure to understand what is needed.
|
|||||||
|
|
||||||
You can use libavcodec or libavformat in your commercial program, but
|
You can use libavcodec or libavformat in your commercial program, but
|
||||||
@emph{any patch you make must be published}. The best way to proceed is
|
@emph{any patch you make must be published}. The best way to proceed is
|
||||||
to send your patches to the FFmpeg mailing list.
|
to send your patches to the Libav mailing list.
|
||||||
|
|
||||||
@anchor{Coding Rules}
|
@anchor{Coding Rules}
|
||||||
@section Coding Rules
|
@section Coding Rules
|
||||||
|
|
||||||
FFmpeg is programmed in the ISO C90 language with a few additional
|
Libav is programmed in the ISO C90 language with a few additional
|
||||||
features from ISO C99, namely:
|
features from ISO C99, namely:
|
||||||
@itemize @bullet
|
@itemize @bullet
|
||||||
@item
|
@item
|
||||||
@ -54,7 +54,7 @@ These features are supported by all compilers we care about, so we will not
|
|||||||
accept patches to remove their use unless they absolutely do not impair
|
accept patches to remove their use unless they absolutely do not impair
|
||||||
clarity and performance.
|
clarity and performance.
|
||||||
|
|
||||||
All code must compile with GCC 2.95 and GCC 3.3. Currently, FFmpeg also
|
All code must compile with GCC 2.95 and GCC 3.3. Currently, Libav also
|
||||||
compiles with several other compilers, such as the Compaq ccc compiler
|
compiles with several other compilers, such as the Compaq ccc compiler
|
||||||
or Sun Studio 9, and we would like to keep it that way unless it would
|
or Sun Studio 9, and we would like to keep it that way unless it would
|
||||||
be exceedingly involved. To ensure compatibility, please do not use any
|
be exceedingly involved. To ensure compatibility, please do not use any
|
||||||
@ -76,7 +76,7 @@ The TAB character is forbidden outside of Makefiles as is any
|
|||||||
form of trailing whitespace. Commits containing either will be
|
form of trailing whitespace. Commits containing either will be
|
||||||
rejected by the Subversion repository.
|
rejected by the Subversion repository.
|
||||||
|
|
||||||
The main priority in FFmpeg is simplicity and small code size in order to
|
The main priority in Libav is simplicity and small code size in order to
|
||||||
minimize the bug count.
|
minimize the bug count.
|
||||||
|
|
||||||
Comments: Use the JavaDoc/Doxygen
|
Comments: Use the JavaDoc/Doxygen
|
||||||
@ -129,7 +129,7 @@ should also be avoided if they don't make the code easier to understand.
|
|||||||
an "or any later version" clause is also acceptable, but LGPL is
|
an "or any later version" clause is also acceptable, but LGPL is
|
||||||
preferred.
|
preferred.
|
||||||
@item
|
@item
|
||||||
You must not commit code which breaks FFmpeg! (Meaning unfinished but
|
You must not commit code which breaks Libav! (Meaning unfinished but
|
||||||
enabled code which breaks compilation or compiles but does not work or
|
enabled code which breaks compilation or compiles but does not work or
|
||||||
breaks the regression tests)
|
breaks the regression tests)
|
||||||
You can commit unfinished stuff (for testing etc), but it must be disabled
|
You can commit unfinished stuff (for testing etc), but it must be disabled
|
||||||
@ -168,7 +168,7 @@ should also be avoided if they don't make the code easier to understand.
|
|||||||
with functional changes, such commits will be rejected and removed. Every
|
with functional changes, such commits will be rejected and removed. Every
|
||||||
developer has his own indentation style, you should not change it. Of course
|
developer has his own indentation style, you should not change it. Of course
|
||||||
if you (re)write something, you can use your own style, even though we would
|
if you (re)write something, you can use your own style, even though we would
|
||||||
prefer if the indentation throughout FFmpeg was consistent (Many projects
|
prefer if the indentation throughout Libav was consistent (Many projects
|
||||||
force a given indentation style - we do not.). If you really need to make
|
force a given indentation style - we do not.). If you really need to make
|
||||||
indentation changes (try to avoid this), separate them strictly from real
|
indentation changes (try to avoid this), separate them strictly from real
|
||||||
changes.
|
changes.
|
||||||
@ -253,7 +253,7 @@ keeping it as a logical unit that contains an individual change, even
|
|||||||
if it spans multiple files. This makes reviewing your patches much easier
|
if it spans multiple files. This makes reviewing your patches much easier
|
||||||
for us and greatly increases your chances of getting your patch applied.
|
for us and greatly increases your chances of getting your patch applied.
|
||||||
|
|
||||||
Use the patcheck tool of FFmpeg to check your patch.
|
Use the patcheck tool of Libav to check your patch.
|
||||||
The tool is located in the tools directory.
|
The tool is located in the tools directory.
|
||||||
|
|
||||||
Run the regression tests before submitting a patch so that you can
|
Run the regression tests before submitting a patch so that you can
|
||||||
@ -275,7 +275,7 @@ Your patch will be reviewed on the mailing list. You will likely be asked
|
|||||||
to make some changes and are expected to send in an improved version that
|
to make some changes and are expected to send in an improved version that
|
||||||
incorporates the requests from the review. This process may go through
|
incorporates the requests from the review. This process may go through
|
||||||
several iterations. Once your patch is deemed good enough, some developer
|
several iterations. Once your patch is deemed good enough, some developer
|
||||||
will pick it up and commit it to the official FFmpeg tree.
|
will pick it up and commit it to the official Libav tree.
|
||||||
|
|
||||||
Give us a few days to react. But if some time passes without reaction,
|
Give us a few days to react. But if some time passes without reaction,
|
||||||
send a reminder by email. Your patch should eventually be dealt with.
|
send a reminder by email. Your patch should eventually be dealt with.
|
||||||
@ -325,7 +325,7 @@ send a reminder by email. Your patch should eventually be dealt with.
|
|||||||
@item
|
@item
|
||||||
Is the patch a unified diff?
|
Is the patch a unified diff?
|
||||||
@item
|
@item
|
||||||
Is the patch against latest FFmpeg git master branch?
|
Is the patch against latest Libav git master branch?
|
||||||
@item
|
@item
|
||||||
Are you subscribed to ffmpeg-dev?
|
Are you subscribed to ffmpeg-dev?
|
||||||
(the list is subscribers only due to spam)
|
(the list is subscribers only due to spam)
|
||||||
@ -374,7 +374,7 @@ send a reminder by email. Your patch should eventually be dealt with.
|
|||||||
patch easily?
|
patch easily?
|
||||||
@item
|
@item
|
||||||
If you added a new file, did you insert a license header? It should be
|
If you added a new file, did you insert a license header? It should be
|
||||||
taken from FFmpeg, not randomly copied and pasted from somewhere else.
|
taken from Libav, not randomly copied and pasted from somewhere else.
|
||||||
@item
|
@item
|
||||||
You should maintain alphabetical order in alphabetically ordered lists as
|
You should maintain alphabetical order in alphabetically ordered lists as
|
||||||
long as doing so does not break API/ABI compatibility.
|
long as doing so does not break API/ABI compatibility.
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
@chapter Encoders
|
@chapter Encoders
|
||||||
@c man begin ENCODERS
|
@c man begin ENCODERS
|
||||||
|
|
||||||
Encoders are configured elements in FFmpeg which allow the encoding of
|
Encoders are configured elements in Libav which allow the encoding of
|
||||||
multimedia streams.
|
multimedia streams.
|
||||||
|
|
||||||
When you configure your FFmpeg build, all the supported native encoders
|
When you configure your Libav build, all the supported native encoders
|
||||||
are enabled by default. Encoders requiring an external library must be enabled
|
are enabled by default. Encoders requiring an external library must be enabled
|
||||||
manually via the corresponding @code{--enable-lib} option. You can list all
|
manually via the corresponding @code{--enable-lib} option. You can list all
|
||||||
available encoders using the configure option @code{--list-encoders}.
|
available encoders using the configure option @code{--list-encoders}.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
@chapter Expression Evaluation
|
@chapter Expression Evaluation
|
||||||
@c man begin EXPRESSION EVALUATION
|
@c man begin EXPRESSION EVALUATION
|
||||||
|
|
||||||
When evaluating an arithemetic expression, FFmpeg uses an internal
|
When evaluating an arithemetic expression, Libav uses an internal
|
||||||
formula evaluator, implemented through the @file{libavutil/eval.h}
|
formula evaluator, implemented through the @file{libavutil/eval.h}
|
||||||
interface.
|
interface.
|
||||||
|
|
||||||
|
56
doc/faq.texi
56
doc/faq.texi
@ -1,8 +1,8 @@
|
|||||||
\input texinfo @c -*- texinfo -*-
|
\input texinfo @c -*- texinfo -*-
|
||||||
|
|
||||||
@settitle FFmpeg FAQ
|
@settitle Libav FAQ
|
||||||
@titlepage
|
@titlepage
|
||||||
@center @titlefont{FFmpeg FAQ}
|
@center @titlefont{Libav FAQ}
|
||||||
@end titlepage
|
@end titlepage
|
||||||
|
|
||||||
@top
|
@top
|
||||||
@ -11,33 +11,33 @@
|
|||||||
|
|
||||||
@chapter General Questions
|
@chapter General Questions
|
||||||
|
|
||||||
@section When will the next FFmpeg version be released? / Why are FFmpeg releases so few and far between?
|
@section When will the next Libav version be released? / Why are Libav releases so few and far between?
|
||||||
|
|
||||||
Like most open source projects FFmpeg suffers from a certain lack of
|
Like most open source projects Libav suffers from a certain lack of
|
||||||
manpower. For this reason the developers have to prioritize the work
|
manpower. For this reason the developers have to prioritize the work
|
||||||
they do and putting out releases is not at the top of the list, fixing
|
they do and putting out releases is not at the top of the list, fixing
|
||||||
bugs and reviewing patches takes precedence. Please don't complain or
|
bugs and reviewing patches takes precedence. Please don't complain or
|
||||||
request more timely and/or frequent releases unless you are willing to
|
request more timely and/or frequent releases unless you are willing to
|
||||||
help out creating them.
|
help out creating them.
|
||||||
|
|
||||||
@section I have a problem with an old version of FFmpeg; where should I report it?
|
@section I have a problem with an old version of Libav; where should I report it?
|
||||||
Nowhere. We do not support old FFmpeg versions in any way, we simply lack
|
Nowhere. We do not support old Libav versions in any way, we simply lack
|
||||||
the time, motivation and manpower to do so. If you have a problem with an
|
the time, motivation and manpower to do so. If you have a problem with an
|
||||||
old version of FFmpeg, upgrade to the latest Subversion snapshot. If you
|
old version of Libav, upgrade to the latest Subversion snapshot. If you
|
||||||
still experience the problem, then you can report it according to the
|
still experience the problem, then you can report it according to the
|
||||||
guidelines in @url{http://ffmpeg.org/bugreports.html}.
|
guidelines in @url{http://ffmpeg.org/bugreports.html}.
|
||||||
|
|
||||||
@section Why doesn't FFmpeg support feature [xyz]?
|
@section Why doesn't Libav support feature [xyz]?
|
||||||
|
|
||||||
Because no one has taken on that task yet. FFmpeg development is
|
Because no one has taken on that task yet. Libav development is
|
||||||
driven by the tasks that are important to the individual developers.
|
driven by the tasks that are important to the individual developers.
|
||||||
If there is a feature that is important to you, the best way to get
|
If there is a feature that is important to you, the best way to get
|
||||||
it implemented is to undertake the task yourself or sponsor a developer.
|
it implemented is to undertake the task yourself or sponsor a developer.
|
||||||
|
|
||||||
@section FFmpeg does not support codec XXX. Can you include a Windows DLL loader to support it?
|
@section Libav does not support codec XXX. Can you include a Windows DLL loader to support it?
|
||||||
|
|
||||||
No. Windows DLLs are not portable, bloated and often slow.
|
No. Windows DLLs are not portable, bloated and often slow.
|
||||||
Moreover FFmpeg strives to support all codecs natively.
|
Moreover Libav strives to support all codecs natively.
|
||||||
A DLL loader is not conducive to that goal.
|
A DLL loader is not conducive to that goal.
|
||||||
|
|
||||||
@section My bug report/mail to ffmpeg-devel/user has not received any replies.
|
@section My bug report/mail to ffmpeg-devel/user has not received any replies.
|
||||||
@ -55,10 +55,10 @@ libav* from another application.
|
|||||||
@item You speak about a video having problems on playback but
|
@item You speak about a video having problems on playback but
|
||||||
not what you use to play it.
|
not what you use to play it.
|
||||||
@item We have no faint clue what you are talking about besides
|
@item We have no faint clue what you are talking about besides
|
||||||
that it is related to FFmpeg.
|
that it is related to Libav.
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
@section Is there a forum for FFmpeg? I do not like mailing lists.
|
@section Is there a forum for Libav? I do not like mailing lists.
|
||||||
|
|
||||||
You may view our mailing lists with a more forum-alike look here:
|
You may view our mailing lists with a more forum-alike look here:
|
||||||
@url{http://dir.gmane.org/gmane.comp.video.ffmpeg.user},
|
@url{http://dir.gmane.org/gmane.comp.video.ffmpeg.user},
|
||||||
@ -272,7 +272,7 @@ material, and try '-top 0/1' if the result looks really messed-up.
|
|||||||
|
|
||||||
@section How can I read DirectShow files?
|
@section How can I read DirectShow files?
|
||||||
|
|
||||||
If you have built FFmpeg with @code{./configure --enable-avisynth}
|
If you have built Libav with @code{./configure --enable-avisynth}
|
||||||
(only possible on MinGW/Cygwin platforms),
|
(only possible on MinGW/Cygwin platforms),
|
||||||
then you may use any file that DirectShow can read as input.
|
then you may use any file that DirectShow can read as input.
|
||||||
|
|
||||||
@ -368,11 +368,11 @@ examining all of the vbv_delay values and making complicated computations."
|
|||||||
|
|
||||||
@chapter Development
|
@chapter Development
|
||||||
|
|
||||||
@section Are there examples illustrating how to use the FFmpeg libraries, particularly libavcodec and libavformat?
|
@section Are there examples illustrating how to use the Libav libraries, particularly libavcodec and libavformat?
|
||||||
|
|
||||||
Yes. Read the Developers Guide of the FFmpeg documentation. Alternatively,
|
Yes. Read the Developers Guide of the Libav documentation. Alternatively,
|
||||||
examine the source code for one of the many open source projects that
|
examine the source code for one of the many open source projects that
|
||||||
already incorporate FFmpeg at (@url{projects.html}).
|
already incorporate Libav at (@url{projects.html}).
|
||||||
|
|
||||||
@section Can you support my C compiler XXX?
|
@section Can you support my C compiler XXX?
|
||||||
|
|
||||||
@ -383,14 +383,14 @@ with @code{#ifdef}s related to the compiler.
|
|||||||
@section Is Microsoft Visual C++ supported?
|
@section Is Microsoft Visual C++ supported?
|
||||||
|
|
||||||
No. Microsoft Visual C++ is not compliant to the C99 standard and does
|
No. Microsoft Visual C++ is not compliant to the C99 standard and does
|
||||||
not - among other things - support the inline assembly used in FFmpeg.
|
not - among other things - support the inline assembly used in Libav.
|
||||||
If you wish to use MSVC++ for your
|
If you wish to use MSVC++ for your
|
||||||
project then you can link the MSVC++ code with libav* as long as
|
project then you can link the MSVC++ code with libav* as long as
|
||||||
you compile the latter with a working C compiler. For more information, see
|
you compile the latter with a working C compiler. For more information, see
|
||||||
the @emph{Microsoft Visual C++ compatibility} section in the FFmpeg
|
the @emph{Microsoft Visual C++ compatibility} section in the Libav
|
||||||
documentation.
|
documentation.
|
||||||
|
|
||||||
There have been efforts to make FFmpeg compatible with MSVC++ in the
|
There have been efforts to make Libav compatible with MSVC++ in the
|
||||||
past. However, they have all been rejected as too intrusive, especially
|
past. However, they have all been rejected as too intrusive, especially
|
||||||
since MinGW does the job adequately. None of the core developers
|
since MinGW does the job adequately. None of the core developers
|
||||||
work with MSVC++ and thus this item is low priority. Should you find
|
work with MSVC++ and thus this item is low priority. Should you find
|
||||||
@ -398,13 +398,13 @@ the silver bullet that solves this problem, feel free to shoot it at us.
|
|||||||
|
|
||||||
We strongly recommend you to move over from MSVC++ to MinGW tools.
|
We strongly recommend you to move over from MSVC++ to MinGW tools.
|
||||||
|
|
||||||
@section Can I use FFmpeg or libavcodec under Windows?
|
@section Can I use Libav or libavcodec under Windows?
|
||||||
|
|
||||||
Yes, but the Cygwin or MinGW tools @emph{must} be used to compile FFmpeg.
|
Yes, but the Cygwin or MinGW tools @emph{must} be used to compile Libav.
|
||||||
Read the @emph{Windows} section in the FFmpeg documentation to find more
|
Read the @emph{Windows} section in the Libav documentation to find more
|
||||||
information.
|
information.
|
||||||
|
|
||||||
To get help and instructions for building FFmpeg under Windows, check out
|
To get help and instructions for building Libav under Windows, check out
|
||||||
the FFmpeg Windows Help Forum at
|
the FFmpeg Windows Help Forum at
|
||||||
@url{http://ffmpeg.arrozcru.org/}.
|
@url{http://ffmpeg.arrozcru.org/}.
|
||||||
|
|
||||||
@ -414,7 +414,7 @@ No. These tools are too bloated and they complicate the build.
|
|||||||
|
|
||||||
@section Why not rewrite ffmpeg in object-oriented C++?
|
@section Why not rewrite ffmpeg in object-oriented C++?
|
||||||
|
|
||||||
FFmpeg is already organized in a highly modular manner and does not need to
|
Libav is already organized in a highly modular manner and does not need to
|
||||||
be rewritten in a formal object language. Further, many of the developers
|
be rewritten in a formal object language. Further, many of the developers
|
||||||
favor straight C; it works for them. For more arguments on this matter,
|
favor straight C; it works for them. For more arguments on this matter,
|
||||||
read "Programming Religion" at (@url{http://www.tux.org/lkml/#s15}).
|
read "Programming Religion" at (@url{http://www.tux.org/lkml/#s15}).
|
||||||
@ -441,16 +441,16 @@ the compilation failure then you are probably not qualified for this.
|
|||||||
|
|
||||||
@section I'm using libavcodec from within my C++ application but the linker complains about missing symbols which seem to be available.
|
@section I'm using libavcodec from within my C++ application but the linker complains about missing symbols which seem to be available.
|
||||||
|
|
||||||
FFmpeg is a pure C project, so to use the libraries within your C++ application
|
Libav is a pure C project, so to use the libraries within your C++ application
|
||||||
you need to explicitly state that you are using a C library. You can do this by
|
you need to explicitly state that you are using a C library. You can do this by
|
||||||
encompassing your FFmpeg includes using @code{extern "C"}.
|
encompassing your Libav includes using @code{extern "C"}.
|
||||||
|
|
||||||
See @url{http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3}
|
See @url{http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3}
|
||||||
|
|
||||||
@section I have a file in memory / a API different from *open/*read/ libc how do I use it with libavformat?
|
@section I have a file in memory / a API different from *open/*read/ libc how do I use it with libavformat?
|
||||||
|
|
||||||
You have to implement a URLProtocol, see @file{libavformat/file.c} in
|
You have to implement a URLProtocol, see @file{libavformat/file.c} in
|
||||||
FFmpeg and @file{libmpdemux/demux_lavf.c} in MPlayer sources.
|
Libav and @file{libmpdemux/demux_lavf.c} in MPlayer sources.
|
||||||
|
|
||||||
@section I get "No compatible shell script interpreter found." in MSys.
|
@section I get "No compatible shell script interpreter found." in MSys.
|
||||||
|
|
||||||
|
@ -735,7 +735,7 @@ A preset file contains a sequence of @var{option}=@var{value} pairs,
|
|||||||
one for each line, specifying a sequence of options which would be
|
one for each line, specifying a sequence of options which would be
|
||||||
awkward to specify on the command line. Lines starting with the hash
|
awkward to specify on the command line. Lines starting with the hash
|
||||||
('#') character are ignored and are used to provide comments. Check
|
('#') character are ignored and are used to provide comments. Check
|
||||||
the @file{ffpresets} directory in the FFmpeg source tree for examples.
|
the @file{ffpresets} directory in the Libav source tree for examples.
|
||||||
|
|
||||||
Preset files are specified with the @code{vpre}, @code{apre},
|
Preset files are specified with the @code{vpre}, @code{apre},
|
||||||
@code{spre}, and @code{fpre} options. The @code{fpre} option takes the
|
@code{spre}, and @code{fpre} options. The @code{fpre} option takes the
|
||||||
@ -997,11 +997,11 @@ file to which you want to add them.
|
|||||||
@settitle FFmpeg video converter
|
@settitle FFmpeg video converter
|
||||||
|
|
||||||
@c man begin SEEALSO
|
@c man begin SEEALSO
|
||||||
ffplay(1), ffprobe(1), ffserver(1) and the FFmpeg HTML documentation
|
ffplay(1), ffprobe(1), ffserver(1) and the Libav HTML documentation
|
||||||
@c man end
|
@c man end
|
||||||
|
|
||||||
@c man begin AUTHORS
|
@c man begin AUTHORS
|
||||||
The FFmpeg developers
|
The Libav developers
|
||||||
@c man end
|
@c man end
|
||||||
|
|
||||||
@end ignore
|
@end ignore
|
||||||
|
@ -20,9 +20,9 @@ ffplay [options] @file{input_file}
|
|||||||
@chapter Description
|
@chapter Description
|
||||||
@c man begin DESCRIPTION
|
@c man begin DESCRIPTION
|
||||||
|
|
||||||
FFplay is a very simple and portable media player using the FFmpeg
|
FFplay is a very simple and portable media player using the Libav
|
||||||
libraries and the SDL library. It is mostly used as a testbed for the
|
libraries and the SDL library. It is mostly used as a testbed for the
|
||||||
various FFmpeg APIs.
|
various Libav APIs.
|
||||||
@c man end
|
@c man end
|
||||||
|
|
||||||
@chapter Options
|
@chapter Options
|
||||||
@ -169,11 +169,11 @@ Seek to percentage in file corresponding to fraction of width.
|
|||||||
@settitle FFplay media player
|
@settitle FFplay media player
|
||||||
|
|
||||||
@c man begin SEEALSO
|
@c man begin SEEALSO
|
||||||
ffmpeg(1), ffprobe(1), ffserver(1) and the FFmpeg HTML documentation
|
ffmpeg(1), ffprobe(1), ffserver(1) and the Libav HTML documentation
|
||||||
@c man end
|
@c man end
|
||||||
|
|
||||||
@c man begin AUTHORS
|
@c man begin AUTHORS
|
||||||
The FFmpeg developers
|
The Libav developers
|
||||||
@c man end
|
@c man end
|
||||||
|
|
||||||
@end ignore
|
@end ignore
|
||||||
|
@ -122,11 +122,11 @@ with name "STREAM".
|
|||||||
@settitle FFprobe media prober
|
@settitle FFprobe media prober
|
||||||
|
|
||||||
@c man begin SEEALSO
|
@c man begin SEEALSO
|
||||||
ffmpeg(1), ffplay(1), ffserver(1) and the FFmpeg HTML documentation
|
ffmpeg(1), ffplay(1), ffserver(1) and the Libav HTML documentation
|
||||||
@c man end
|
@c man end
|
||||||
|
|
||||||
@c man begin AUTHORS
|
@c man begin AUTHORS
|
||||||
The FFmpeg developers
|
The Libav developers
|
||||||
@c man end
|
@c man end
|
||||||
|
|
||||||
@end ignore
|
@end ignore
|
||||||
|
@ -266,11 +266,11 @@ rather than as a daemon.
|
|||||||
@c man begin SEEALSO
|
@c man begin SEEALSO
|
||||||
|
|
||||||
ffmpeg(1), ffplay(1), ffprobe(1), the @file{ffmpeg/doc/ffserver.conf}
|
ffmpeg(1), ffplay(1), ffprobe(1), the @file{ffmpeg/doc/ffserver.conf}
|
||||||
example and the FFmpeg HTML documentation
|
example and the Libav HTML documentation
|
||||||
@c man end
|
@c man end
|
||||||
|
|
||||||
@c man begin AUTHORS
|
@c man begin AUTHORS
|
||||||
The FFmpeg developers
|
The Libav developers
|
||||||
@c man end
|
@c man end
|
||||||
|
|
||||||
@end ignore
|
@end ignore
|
||||||
|
@ -88,6 +88,6 @@ can be disabled setting the environment variable
|
|||||||
@env{FFMPEG_FORCE_NOCOLOR} or @env{NO_COLOR}, or can be forced setting
|
@env{FFMPEG_FORCE_NOCOLOR} or @env{NO_COLOR}, or can be forced setting
|
||||||
the environment variable @env{FFMPEG_FORCE_COLOR}.
|
the environment variable @env{FFMPEG_FORCE_COLOR}.
|
||||||
The use of the environment variable @env{NO_COLOR} is deprecated and
|
The use of the environment variable @env{NO_COLOR} is deprecated and
|
||||||
will be dropped in a following FFmpeg version.
|
will be dropped in a following Libav version.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
@ -92,7 +92,7 @@ Follows a BNF description for the filtergraph syntax:
|
|||||||
@chapter Audio Filters
|
@chapter Audio Filters
|
||||||
@c man begin AUDIO FILTERS
|
@c man begin AUDIO FILTERS
|
||||||
|
|
||||||
When you configure your FFmpeg build, you can disable any of the
|
When you configure your Libav build, you can disable any of the
|
||||||
existing filters using --disable-filters.
|
existing filters using --disable-filters.
|
||||||
The configure output will show the audio filters included in your
|
The configure output will show the audio filters included in your
|
||||||
build.
|
build.
|
||||||
@ -155,7 +155,7 @@ tools.
|
|||||||
@chapter Video Filters
|
@chapter Video Filters
|
||||||
@c man begin VIDEO FILTERS
|
@c man begin VIDEO FILTERS
|
||||||
|
|
||||||
When you configure your FFmpeg build, you can disable any of the
|
When you configure your Libav build, you can disable any of the
|
||||||
existing filters using --disable-filters.
|
existing filters using --disable-filters.
|
||||||
The configure output will show the video filters included in your
|
The configure output will show the video filters included in your
|
||||||
build.
|
build.
|
||||||
@ -531,7 +531,7 @@ format=yuv420p:yuv444p:yuv410p
|
|||||||
Apply a frei0r effect to the input video.
|
Apply a frei0r effect to the input video.
|
||||||
|
|
||||||
To enable compilation of this filter you need to install the frei0r
|
To enable compilation of this filter you need to install the frei0r
|
||||||
header and configure FFmpeg with --enable-frei0r.
|
header and configure Libav with --enable-frei0r.
|
||||||
|
|
||||||
The filter supports the syntax:
|
The filter supports the syntax:
|
||||||
@example
|
@example
|
||||||
@ -669,7 +669,7 @@ Pass the video source unchanged to the output.
|
|||||||
Apply video transform using libopencv.
|
Apply video transform using libopencv.
|
||||||
|
|
||||||
To enable this filter install libopencv library and headers and
|
To enable this filter install libopencv library and headers and
|
||||||
configure FFmpeg with --enable-libopencv.
|
configure Libav with --enable-libopencv.
|
||||||
|
|
||||||
The filter takes the parameters: @var{filter_name}@{:=@}@var{filter_params}.
|
The filter takes the parameters: @var{filter_name}@{:=@}@var{filter_params}.
|
||||||
|
|
||||||
@ -1314,7 +1314,7 @@ timebase. The expression can contain the constants "PI", "E", "PHI",
|
|||||||
Provide a frei0r source.
|
Provide a frei0r source.
|
||||||
|
|
||||||
To enable compilation of this filter you need to install the frei0r
|
To enable compilation of this filter you need to install the frei0r
|
||||||
header and configure FFmpeg with --enable-frei0r.
|
header and configure Libav with --enable-frei0r.
|
||||||
|
|
||||||
The source supports the syntax:
|
The source supports the syntax:
|
||||||
@example
|
@example
|
||||||
|
@ -11,13 +11,13 @@
|
|||||||
|
|
||||||
@chapter external libraries
|
@chapter external libraries
|
||||||
|
|
||||||
FFmpeg can be hooked up with a number of external libraries to add support
|
Libav can be hooked up with a number of external libraries to add support
|
||||||
for more formats. None of them are used by default, their use has to be
|
for more formats. None of them are used by default, their use has to be
|
||||||
explicitly requested by passing the appropriate flags to @file{./configure}.
|
explicitly requested by passing the appropriate flags to @file{./configure}.
|
||||||
|
|
||||||
@section OpenCORE AMR
|
@section OpenCORE AMR
|
||||||
|
|
||||||
FFmpeg can make use of the OpenCORE libraries for AMR-NB
|
Libav can make use of the OpenCORE libraries for AMR-NB
|
||||||
decoding/encoding and AMR-WB decoding.
|
decoding/encoding and AMR-WB decoding.
|
||||||
|
|
||||||
Go to @url{http://sourceforge.net/projects/opencore-amr/} and follow the instructions for
|
Go to @url{http://sourceforge.net/projects/opencore-amr/} and follow the instructions for
|
||||||
@ -27,7 +27,7 @@ installing the libraries. Then pass @code{--enable-libopencore-amrnb} and/or
|
|||||||
Note that OpenCORE is under the Apache License 2.0 (see
|
Note that OpenCORE is under the Apache License 2.0 (see
|
||||||
@url{http://www.apache.org/licenses/LICENSE-2.0} for details), which is
|
@url{http://www.apache.org/licenses/LICENSE-2.0} for details), which is
|
||||||
incompatible with the LGPL version 2.1 and GPL version 2. You have to
|
incompatible with the LGPL version 2.1 and GPL version 2. You have to
|
||||||
upgrade FFmpeg's license to LGPL version 3 (or if you have enabled
|
upgrade Libav's license to LGPL version 3 (or if you have enabled
|
||||||
GPL components, GPL version 3) to use it.
|
GPL components, GPL version 3) to use it.
|
||||||
|
|
||||||
|
|
||||||
@ -37,7 +37,7 @@ You can use the @code{-formats} and @code{-codecs} options to have an exhaustive
|
|||||||
|
|
||||||
@section File Formats
|
@section File Formats
|
||||||
|
|
||||||
FFmpeg supports the following file formats through the @code{libavformat}
|
Libav supports the following file formats through the @code{libavformat}
|
||||||
library:
|
library:
|
||||||
|
|
||||||
@multitable @columnfractions .4 .1 .1 .4
|
@multitable @columnfractions .4 .1 .1 .4
|
||||||
@ -751,18 +751,18 @@ Using a cross-compiler is preferred for various reasons.
|
|||||||
|
|
||||||
@subsection DJGPP
|
@subsection DJGPP
|
||||||
|
|
||||||
FFmpeg cannot be compiled because of broken system headers, add
|
Libav cannot be compiled because of broken system headers, add
|
||||||
@code{--extra-cflags=-U__STRICT_ANSI__} to the configure options as a
|
@code{--extra-cflags=-U__STRICT_ANSI__} to the configure options as a
|
||||||
workaround.
|
workaround.
|
||||||
|
|
||||||
@section OS/2
|
@section OS/2
|
||||||
|
|
||||||
For information about compiling FFmpeg on OS/2 see
|
For information about compiling Libav on OS/2 see
|
||||||
@url{http://www.edm2.com/index.php/FFmpeg}.
|
@url{http://www.edm2.com/index.php/FFmpeg}.
|
||||||
|
|
||||||
@section Unix-like
|
@section Unix-like
|
||||||
|
|
||||||
Some parts of FFmpeg cannot be built with version 2.15 of the GNU
|
Some parts of Libav cannot be built with version 2.15 of the GNU
|
||||||
assembler which is still provided by a few AMD64 distributions. To
|
assembler which is still provided by a few AMD64 distributions. To
|
||||||
make sure your compiler really uses the required version of gas
|
make sure your compiler really uses the required version of gas
|
||||||
after a binutils upgrade, run:
|
after a binutils upgrade, run:
|
||||||
@ -777,7 +777,7 @@ to configure.
|
|||||||
|
|
||||||
@subsection BSD
|
@subsection BSD
|
||||||
|
|
||||||
BSD make will not build FFmpeg, you need to install and use GNU Make
|
BSD make will not build Libav, you need to install and use GNU Make
|
||||||
(@file{gmake}).
|
(@file{gmake}).
|
||||||
|
|
||||||
@subsubsection FreeBSD
|
@subsubsection FreeBSD
|
||||||
@ -790,7 +790,7 @@ getting the system headers fixed.
|
|||||||
|
|
||||||
@subsection (Open)Solaris
|
@subsection (Open)Solaris
|
||||||
|
|
||||||
GNU Make is required to build FFmpeg, so you have to invoke (@file{gmake}),
|
GNU Make is required to build Libav, so you have to invoke (@file{gmake}),
|
||||||
standard Solaris Make will not work. When building with a non-c99 front-end
|
standard Solaris Make will not work. When building with a non-c99 front-end
|
||||||
(gcc, generic suncc) add either @code{--extra-libs=/usr/lib/values-xpg6.o}
|
(gcc, generic suncc) add either @code{--extra-libs=/usr/lib/values-xpg6.o}
|
||||||
or @code{--extra-libs=/usr/lib/64/values-xpg6.o} to the configure options
|
or @code{--extra-libs=/usr/lib/64/values-xpg6.o} to the configure options
|
||||||
@ -808,22 +808,22 @@ bash ./configure
|
|||||||
MacOS X on PowerPC or ARM (iPhone) requires a preprocessor from
|
MacOS X on PowerPC or ARM (iPhone) requires a preprocessor from
|
||||||
@url{http://github.com/yuvi/gas-preprocessor} to build the optimized
|
@url{http://github.com/yuvi/gas-preprocessor} to build the optimized
|
||||||
assembler functions. Just download the Perl script and put it somewhere
|
assembler functions. Just download the Perl script and put it somewhere
|
||||||
in your PATH, FFmpeg's configure will pick it up automatically.
|
in your PATH, Libav's configure will pick it up automatically.
|
||||||
|
|
||||||
@section Windows
|
@section Windows
|
||||||
|
|
||||||
To get help and instructions for building FFmpeg under Windows, check out
|
To get help and instructions for building Libav under Windows, check out
|
||||||
the FFmpeg Windows Help Forum at
|
the FFmpeg Windows Help Forum at
|
||||||
@url{http://ffmpeg.arrozcru.org/}.
|
@url{http://ffmpeg.arrozcru.org/}.
|
||||||
|
|
||||||
@subsection Native Windows compilation
|
@subsection Native Windows compilation
|
||||||
|
|
||||||
FFmpeg can be built to run natively on Windows using the MinGW tools. Install
|
Libav can be built to run natively on Windows using the MinGW tools. Install
|
||||||
the latest versions of MSYS and MinGW from @url{http://www.mingw.org/}.
|
the latest versions of MSYS and MinGW from @url{http://www.mingw.org/}.
|
||||||
You can find detailed installation
|
You can find detailed installation
|
||||||
instructions in the download section and the FAQ.
|
instructions in the download section and the FAQ.
|
||||||
|
|
||||||
FFmpeg does not build out-of-the-box with the packages the automated MinGW
|
Libav does not build out-of-the-box with the packages the automated MinGW
|
||||||
installer provides. It also requires coreutils to be installed and many other
|
installer provides. It also requires coreutils to be installed and many other
|
||||||
packages updated to the latest version. The minimum version for some packages
|
packages updated to the latest version. The minimum version for some packages
|
||||||
are listed below:
|
are listed below:
|
||||||
@ -835,7 +835,7 @@ are listed below:
|
|||||||
@item mingw-runtime 3.15
|
@item mingw-runtime 3.15
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
FFmpeg automatically passes @code{-fno-common} to the compiler to work around
|
Libav automatically passes @code{-fno-common} to the compiler to work around
|
||||||
a GCC bug (see @url{http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37216}).
|
a GCC bug (see @url{http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37216}).
|
||||||
|
|
||||||
Within the MSYS shell, configure and make with:
|
Within the MSYS shell, configure and make with:
|
||||||
@ -866,14 +866,14 @@ Edit the @file{bin/sdl-config} script so that it points to the correct prefix
|
|||||||
where SDL was installed. Verify that @file{sdl-config} can be launched from
|
where SDL was installed. Verify that @file{sdl-config} can be launched from
|
||||||
the MSYS command line.
|
the MSYS command line.
|
||||||
|
|
||||||
@item By using @code{./configure --enable-shared} when configuring FFmpeg,
|
@item By using @code{./configure --enable-shared} when configuring Libav,
|
||||||
you can build libavutil, libavcodec and libavformat as DLLs.
|
you can build libavutil, libavcodec and libavformat as DLLs.
|
||||||
|
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
@subsection Microsoft Visual C++ compatibility
|
@subsection Microsoft Visual C++ compatibility
|
||||||
|
|
||||||
As stated in the FAQ, FFmpeg will not compile under MSVC++. However, if you
|
As stated in the FAQ, Libav will not compile under MSVC++. However, if you
|
||||||
want to use the libav* libraries in your own applications, you can still
|
want to use the libav* libraries in your own applications, you can still
|
||||||
compile those applications using MSVC++. But the libav* libraries you link
|
compile those applications using MSVC++. But the libav* libraries you link
|
||||||
to @emph{must} be built with MinGW. However, you will not be able to debug
|
to @emph{must} be built with MinGW. However, you will not be able to debug
|
||||||
@ -881,13 +881,13 @@ inside the libav* libraries, since MSVC++ does not recognize the debug
|
|||||||
symbols generated by GCC.
|
symbols generated by GCC.
|
||||||
We strongly recommend you to move over from MSVC++ to MinGW tools.
|
We strongly recommend you to move over from MSVC++ to MinGW tools.
|
||||||
|
|
||||||
This description of how to use the FFmpeg libraries with MSVC++ is based on
|
This description of how to use the Libav libraries with MSVC++ is based on
|
||||||
Microsoft Visual C++ 2005 Express Edition. If you have a different version,
|
Microsoft Visual C++ 2005 Express Edition. If you have a different version,
|
||||||
you might have to modify the procedures slightly.
|
you might have to modify the procedures slightly.
|
||||||
|
|
||||||
@subsubsection Using static libraries
|
@subsubsection Using static libraries
|
||||||
|
|
||||||
Assuming you have just built and installed FFmpeg in @file{/usr/local}.
|
Assuming you have just built and installed Libav in @file{/usr/local}.
|
||||||
|
|
||||||
@enumerate
|
@enumerate
|
||||||
|
|
||||||
@ -898,13 +898,13 @@ Application Wizard, uncheck the "Precompiled headers" option.
|
|||||||
@item Write the source code for your application, or, for testing, just
|
@item Write the source code for your application, or, for testing, just
|
||||||
copy the code from an existing sample application into the source file
|
copy the code from an existing sample application into the source file
|
||||||
that MSVC++ has already created for you. For example, you can copy
|
that MSVC++ has already created for you. For example, you can copy
|
||||||
@file{libavformat/output-example.c} from the FFmpeg distribution.
|
@file{libavformat/output-example.c} from the Libav distribution.
|
||||||
|
|
||||||
@item Open the "Project / Properties" dialog box. In the "Configuration"
|
@item Open the "Project / Properties" dialog box. In the "Configuration"
|
||||||
combo box, select "All Configurations" so that the changes you make will
|
combo box, select "All Configurations" so that the changes you make will
|
||||||
affect both debug and release builds. In the tree view on the left hand
|
affect both debug and release builds. In the tree view on the left hand
|
||||||
side, select "C/C++ / General", then edit the "Additional Include
|
side, select "C/C++ / General", then edit the "Additional Include
|
||||||
Directories" setting to contain the path where the FFmpeg includes were
|
Directories" setting to contain the path where the Libav includes were
|
||||||
installed (i.e. @file{c:\msys\1.0\local\include}).
|
installed (i.e. @file{c:\msys\1.0\local\include}).
|
||||||
Do not add MinGW's include directory here, or the include files will
|
Do not add MinGW's include directory here, or the include files will
|
||||||
conflict with MSVC's.
|
conflict with MSVC's.
|
||||||
@ -912,7 +912,7 @@ conflict with MSVC's.
|
|||||||
@item Still in the "Project / Properties" dialog box, select
|
@item Still in the "Project / Properties" dialog box, select
|
||||||
"Linker / General" from the tree view and edit the
|
"Linker / General" from the tree view and edit the
|
||||||
"Additional Library Directories" setting to contain the @file{lib}
|
"Additional Library Directories" setting to contain the @file{lib}
|
||||||
directory where FFmpeg was installed (i.e. @file{c:\msys\1.0\local\lib}),
|
directory where Libav was installed (i.e. @file{c:\msys\1.0\local\lib}),
|
||||||
the directory where MinGW libs are installed (i.e. @file{c:\mingw\lib}),
|
the directory where MinGW libs are installed (i.e. @file{c:\mingw\lib}),
|
||||||
and the directory where MinGW's GCC libs are installed
|
and the directory where MinGW's GCC libs are installed
|
||||||
(i.e. @file{C:\mingw\lib\gcc\mingw32\4.2.1-sjlj}). Then select
|
(i.e. @file{C:\mingw\lib\gcc\mingw32\4.2.1-sjlj}). Then select
|
||||||
@ -929,13 +929,13 @@ set to "Multi-threaded DLL".
|
|||||||
|
|
||||||
@item Click "OK" to close the "Project / Properties" dialog box.
|
@item Click "OK" to close the "Project / Properties" dialog box.
|
||||||
|
|
||||||
@item MSVC++ lacks some C99 header files that are fundamental for FFmpeg.
|
@item MSVC++ lacks some C99 header files that are fundamental for Libav.
|
||||||
Get msinttypes from @url{http://code.google.com/p/msinttypes/downloads/list}
|
Get msinttypes from @url{http://code.google.com/p/msinttypes/downloads/list}
|
||||||
and install it in MSVC++'s include directory
|
and install it in MSVC++'s include directory
|
||||||
(i.e. @file{C:\Program Files\Microsoft Visual Studio 8\VC\include}).
|
(i.e. @file{C:\Program Files\Microsoft Visual Studio 8\VC\include}).
|
||||||
|
|
||||||
@item MSVC++ also does not understand the @code{inline} keyword used by
|
@item MSVC++ also does not understand the @code{inline} keyword used by
|
||||||
FFmpeg, so you must add this line before @code{#include}ing libav*:
|
Libav, so you must add this line before @code{#include}ing libav*:
|
||||||
@example
|
@example
|
||||||
#define inline _inline
|
#define inline _inline
|
||||||
@end example
|
@end example
|
||||||
@ -968,10 +968,10 @@ and run @file{c:\msys\1.0\msys.bat} from there.
|
|||||||
@item Within the MSYS shell, run @code{lib.exe}. If you get a help message
|
@item Within the MSYS shell, run @code{lib.exe}. If you get a help message
|
||||||
from @file{Microsoft (R) Library Manager}, this means your environment
|
from @file{Microsoft (R) Library Manager}, this means your environment
|
||||||
variables are set up correctly, the @file{Microsoft (R) Library Manager}
|
variables are set up correctly, the @file{Microsoft (R) Library Manager}
|
||||||
is on the path and will be used by FFmpeg to create
|
is on the path and will be used by Libav to create
|
||||||
MSVC++-compatible import libraries.
|
MSVC++-compatible import libraries.
|
||||||
|
|
||||||
@item Build FFmpeg with
|
@item Build Libav with
|
||||||
|
|
||||||
@example
|
@example
|
||||||
./configure --enable-shared --enable-memalign-hack
|
./configure --enable-shared --enable-memalign-hack
|
||||||
@ -1000,7 +1000,7 @@ of DLL files, but the ones that are actually used to run your application
|
|||||||
are the ones with a major version number in their filenames
|
are the ones with a major version number in their filenames
|
||||||
(i.e. @file{avcodec-51.dll}).
|
(i.e. @file{avcodec-51.dll}).
|
||||||
|
|
||||||
FFmpeg headers do not declare global data for Windows DLLs through the usual
|
Libav headers do not declare global data for Windows DLLs through the usual
|
||||||
dllexport/dllimport interface. Such data will be exported properly while
|
dllexport/dllimport interface. Such data will be exported properly while
|
||||||
building, but to use them in your MSVC++ code you will have to edit the
|
building, but to use them in your MSVC++ code you will have to edit the
|
||||||
appropriate headers and mark the data as dllimport. For example, in
|
appropriate headers and mark the data as dllimport. For example, in
|
||||||
@ -1014,14 +1014,14 @@ extern __declspec(dllimport) const AVPixFmtDescriptor av_pix_fmt_descriptors[];
|
|||||||
You must use the MinGW cross compilation tools available at
|
You must use the MinGW cross compilation tools available at
|
||||||
@url{http://www.mingw.org/}.
|
@url{http://www.mingw.org/}.
|
||||||
|
|
||||||
Then configure FFmpeg with the following options:
|
Then configure Libav with the following options:
|
||||||
@example
|
@example
|
||||||
./configure --target-os=mingw32 --cross-prefix=i386-mingw32msvc-
|
./configure --target-os=mingw32 --cross-prefix=i386-mingw32msvc-
|
||||||
@end example
|
@end example
|
||||||
(you can change the cross-prefix according to the prefix chosen for the
|
(you can change the cross-prefix according to the prefix chosen for the
|
||||||
MinGW tools).
|
MinGW tools).
|
||||||
|
|
||||||
Then you can easily test FFmpeg with Wine
|
Then you can easily test Libav with Wine
|
||||||
(@url{http://www.winehq.com/}).
|
(@url{http://www.winehq.com/}).
|
||||||
|
|
||||||
@subsection Compilation under Cygwin
|
@subsection Compilation under Cygwin
|
||||||
@ -1055,7 +1055,7 @@ shared libraries:
|
|||||||
./configure --enable-shared --disable-static --extra-cflags=-fno-reorder-functions
|
./configure --enable-shared --disable-static --extra-cflags=-fno-reorder-functions
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
If you want to build FFmpeg with additional libraries, download Cygwin
|
If you want to build Libav with additional libraries, download Cygwin
|
||||||
"Devel" packages for Ogg and Vorbis from any Cygwin packages repository:
|
"Devel" packages for Ogg and Vorbis from any Cygwin packages repository:
|
||||||
@example
|
@example
|
||||||
libogg-devel, libvorbis-devel
|
libogg-devel, libvorbis-devel
|
||||||
|
@ -28,9 +28,9 @@ Consult these resources whenever you have problems, they are quite exhaustive.
|
|||||||
You do not need a special username or password.
|
You do not need a special username or password.
|
||||||
All you need is to provide a ssh public key to the Git server admin.
|
All you need is to provide a ssh public key to the Git server admin.
|
||||||
|
|
||||||
What follows now is a basic introduction to Git and some FFmpeg-specific
|
What follows now is a basic introduction to Git and some Libav-specific
|
||||||
guidelines. Read it at least once, if you are granted commit privileges to the
|
guidelines. Read it at least once, if you are granted commit privileges to the
|
||||||
FFmpeg project you are expected to be familiar with these rules.
|
Libav project you are expected to be familiar with these rules.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -46,11 +46,11 @@ I. BASICS:
|
|||||||
|
|
||||||
git clone git://git.videolan.org/ffmpeg <target>
|
git clone git://git.videolan.org/ffmpeg <target>
|
||||||
|
|
||||||
This will put the FFmpeg sources into the directory <target>.
|
This will put the Libav sources into the directory <target>.
|
||||||
|
|
||||||
git clone git@git.videolan.org:ffmpeg <target>
|
git clone git@git.videolan.org:ffmpeg <target>
|
||||||
|
|
||||||
This will put the FFmpeg sources into the directory <target> and let
|
This will put the Libav sources into the directory <target> and let
|
||||||
you push back your changes to the remote repository.
|
you push back your changes to the remote repository.
|
||||||
|
|
||||||
|
|
||||||
@ -72,7 +72,7 @@ I. BASICS:
|
|||||||
|
|
||||||
fetches the changes from the main repository and replays your local commits
|
fetches the changes from the main repository and replays your local commits
|
||||||
over it. This is required to keep all your local changes at the top of
|
over it. This is required to keep all your local changes at the top of
|
||||||
FFmpeg's master tree. The master tree will reject pushes with merge commits.
|
Libav's master tree. The master tree will reject pushes with merge commits.
|
||||||
|
|
||||||
|
|
||||||
3. Adding/removing files/directories:
|
3. Adding/removing files/directories:
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
@chapter Input Devices
|
@chapter Input Devices
|
||||||
@c man begin INPUT DEVICES
|
@c man begin INPUT DEVICES
|
||||||
|
|
||||||
Input devices are configured elements in FFmpeg which allow to access
|
Input devices are configured elements in Libav which allow to access
|
||||||
the data coming from a multimedia device attached to your system.
|
the data coming from a multimedia device attached to your system.
|
||||||
|
|
||||||
When you configure your FFmpeg build, all the supported input devices
|
When you configure your Libav build, all the supported input devices
|
||||||
are enabled by default. You can list all available ones using the
|
are enabled by default. You can list all available ones using the
|
||||||
configure option "--list-indevs".
|
configure option "--list-indevs".
|
||||||
|
|
||||||
@ -95,7 +95,7 @@ A JACK input device creates one or more JACK writable clients, one for
|
|||||||
each audio channel, with name @var{client_name}:input_@var{N}, where
|
each audio channel, with name @var{client_name}:input_@var{N}, where
|
||||||
@var{client_name} is the name provided by the application, and @var{N}
|
@var{client_name} is the name provided by the application, and @var{N}
|
||||||
is a number which identifies the channel.
|
is a number which identifies the channel.
|
||||||
Each writable client will send the acquired data to the FFmpeg input
|
Each writable client will send the acquired data to the Libav input
|
||||||
device.
|
device.
|
||||||
|
|
||||||
Once you have created one or more JACK readable clients, you need to
|
Once you have created one or more JACK readable clients, you need to
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
FFmpeg's bug/patch/feature request tracker manual
|
Libav's bug/patch/feature request tracker manual
|
||||||
=================================================
|
================================================
|
||||||
|
|
||||||
NOTE: This is a draft.
|
NOTE: This is a draft.
|
||||||
|
|
||||||
Overview:
|
Overview:
|
||||||
---------
|
---------
|
||||||
FFmpeg uses Roundup for tracking issues, new issues and changes to
|
Libav uses Roundup for tracking issues, new issues and changes to
|
||||||
existing issues can be done through a web interface and through email.
|
existing issues can be done through a web interface and through email.
|
||||||
It is possible to subscribe to individual issues by adding yourself to the
|
It is possible to subscribe to individual issues by adding yourself to the
|
||||||
nosy list or to subscribe to the ffmpeg-issues mailing list which receives
|
nosy list or to subscribe to the ffmpeg-issues mailing list which receives
|
||||||
@ -60,7 +60,7 @@ critical
|
|||||||
No feature request can be critical.
|
No feature request can be critical.
|
||||||
|
|
||||||
important
|
important
|
||||||
Bugs which make FFmpeg unusable for a significant number of users, and
|
Bugs which make Libav unusable for a significant number of users, and
|
||||||
patches fixing them.
|
patches fixing them.
|
||||||
Examples here might be completely broken MPEG-4 decoding or a build issue
|
Examples here might be completely broken MPEG-4 decoding or a build issue
|
||||||
on Linux.
|
on Linux.
|
||||||
@ -81,7 +81,7 @@ minor
|
|||||||
wish
|
wish
|
||||||
Something that is desirable to have but that there is no urgency at
|
Something that is desirable to have but that there is no urgency at
|
||||||
all to implement, e.g. something completely cosmetic like a website
|
all to implement, e.g. something completely cosmetic like a website
|
||||||
restyle or a personalized doxy template or the FFmpeg logo.
|
restyle or a personalized doxy template or the Libav logo.
|
||||||
This priority is not valid for bugs.
|
This priority is not valid for bugs.
|
||||||
|
|
||||||
|
|
||||||
|
@ -11,10 +11,10 @@
|
|||||||
|
|
||||||
@chapter Introduction
|
@chapter Introduction
|
||||||
|
|
||||||
Libavfilter is the filtering API of FFmpeg. It is the substitute of the
|
Libavfilter is the filtering API of Libav. It is the substitute of the
|
||||||
now deprecated 'vhooks' and started as a Google Summer of Code project.
|
now deprecated 'vhooks' and started as a Google Summer of Code project.
|
||||||
|
|
||||||
Integrating libavfilter into the main FFmpeg repository is a work in
|
Integrating libavfilter into the main Libav repository is a work in
|
||||||
progress. If you wish to try the unfinished development code of
|
progress. If you wish to try the unfinished development code of
|
||||||
libavfilter then check it out from the libavfilter repository into
|
libavfilter then check it out from the libavfilter repository into
|
||||||
some directory of your choice by:
|
some directory of your choice by:
|
||||||
@ -74,7 +74,7 @@ not have video output.
|
|||||||
|
|
||||||
@chapter graph2dot
|
@chapter graph2dot
|
||||||
|
|
||||||
The @file{graph2dot} program included in the FFmpeg @file{tools}
|
The @file{graph2dot} program included in the Libav @file{tools}
|
||||||
directory can be used to parse a filter graph description and issue a
|
directory can be used to parse a filter graph description and issue a
|
||||||
corresponding textual representation in the dot language.
|
corresponding textual representation in the dot language.
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
@chapter Metadata
|
@chapter Metadata
|
||||||
@c man begin METADATA
|
@c man begin METADATA
|
||||||
|
|
||||||
FFmpeg is able to dump metadata from media files into a simple UTF-8-encoded
|
Libav is able to dump metadata from media files into a simple UTF-8-encoded
|
||||||
INI-like text file and then load it back using the metadata muxer/demuxer.
|
INI-like text file and then load it back using the metadata muxer/demuxer.
|
||||||
|
|
||||||
The file format is as follows:
|
The file format is as follows:
|
||||||
@ -53,7 +53,7 @@ A ffmetadata file might look like this:
|
|||||||
;FFMETADATA1
|
;FFMETADATA1
|
||||||
title=bike\\shed
|
title=bike\\shed
|
||||||
;this is a comment
|
;this is a comment
|
||||||
artist=FFmpeg troll team
|
artist=Libav troll team
|
||||||
|
|
||||||
[CHAPTER]
|
[CHAPTER]
|
||||||
TIMEBASE=1/1000
|
TIMEBASE=1/1000
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
FFmpeg multithreading methods
|
Libav multithreading methods
|
||||||
==============================================
|
==============================================
|
||||||
|
|
||||||
FFmpeg provides two methods for multithreading codecs.
|
Libav provides two methods for multithreading codecs.
|
||||||
|
|
||||||
Slice threading decodes multiple parts of a frame at the same time, using
|
Slice threading decodes multiple parts of a frame at the same time, using
|
||||||
AVCodecContext execute() and execute2().
|
AVCodecContext execute() and execute2().
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
@chapter Muxers
|
@chapter Muxers
|
||||||
@c man begin MUXERS
|
@c man begin MUXERS
|
||||||
|
|
||||||
Muxers are configured elements in FFmpeg which allow writing
|
Muxers are configured elements in Libav which allow writing
|
||||||
multimedia streams to a particular type of file.
|
multimedia streams to a particular type of file.
|
||||||
|
|
||||||
When you configure your FFmpeg build, all the supported muxers
|
When you configure your Libav build, all the supported muxers
|
||||||
are enabled by default. You can list all available muxers using the
|
are enabled by default. You can list all available muxers using the
|
||||||
configure option @code{--list-muxers}.
|
configure option @code{--list-muxers}.
|
||||||
|
|
||||||
|
@ -201,7 +201,7 @@ Inline asm vs. external asm
|
|||||||
---------------------------
|
---------------------------
|
||||||
Both inline asm (__asm__("..") in a .c file, handled by a compiler such as gcc)
|
Both inline asm (__asm__("..") in a .c file, handled by a compiler such as gcc)
|
||||||
and external asm (.s or .asm files, handled by an assembler such as yasm/nasm)
|
and external asm (.s or .asm files, handled by an assembler such as yasm/nasm)
|
||||||
are accepted in FFmpeg. Which one to use differs per specific case.
|
are accepted in Libav. Which one to use differs per specific case.
|
||||||
|
|
||||||
- if your code is intended to be inlined in a C function, inline asm is always
|
- if your code is intended to be inlined in a C function, inline asm is always
|
||||||
better, because external asm cannot be inlined
|
better, because external asm cannot be inlined
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
@chapter Output Devices
|
@chapter Output Devices
|
||||||
@c man begin OUTPUT DEVICES
|
@c man begin OUTPUT DEVICES
|
||||||
|
|
||||||
Output devices are configured elements in FFmpeg which allow to write
|
Output devices are configured elements in Libav which allow to write
|
||||||
multimedia data to an output device attached to your system.
|
multimedia data to an output device attached to your system.
|
||||||
|
|
||||||
When you configure your FFmpeg build, all the supported output devices
|
When you configure your Libav build, all the supported output devices
|
||||||
are enabled by default. You can list all available ones using the
|
are enabled by default. You can list all available ones using the
|
||||||
configure option "--list-outdevs".
|
configure option "--list-outdevs".
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
@chapter Protocols
|
@chapter Protocols
|
||||||
@c man begin PROTOCOLS
|
@c man begin PROTOCOLS
|
||||||
|
|
||||||
Protocols are configured elements in FFmpeg which allow to access
|
Protocols are configured elements in Libav which allow to access
|
||||||
resources which require the use of a particular protocol.
|
resources which require the use of a particular protocol.
|
||||||
|
|
||||||
When you configure your FFmpeg build, all the supported protocols are
|
When you configure your Libav build, all the supported protocols are
|
||||||
enabled by default. You can list all available ones using the
|
enabled by default. You can list all available ones using the
|
||||||
configure option "--list-protocols".
|
configure option "--list-protocols".
|
||||||
|
|
||||||
@ -25,8 +25,9 @@ Read Apple HTTP Live Streaming compliant segmented stream as
|
|||||||
a uniform one. The M3U8 playlists describing the segments can be
|
a uniform one. The M3U8 playlists describing the segments can be
|
||||||
remote HTTP resources or local files, accessed using the standard
|
remote HTTP resources or local files, accessed using the standard
|
||||||
file protocol.
|
file protocol.
|
||||||
HTTP is default, specific protocol can be declared using the "+"
|
HTTP is default, specific protocol can be declared by specifying
|
||||||
specifier.
|
"+@var{proto}" after the applehttp URI scheme name, where @var{proto}
|
||||||
|
is either "file" or "http".
|
||||||
|
|
||||||
@example
|
@example
|
||||||
applehttp://host/path/to/remote/resource.m3u8
|
applehttp://host/path/to/remote/resource.m3u8
|
||||||
@ -34,7 +35,6 @@ applehttp+http://host/path/to/remote/resource.m3u8
|
|||||||
applehttp+file://path/to/local/resource.m3u8
|
applehttp+file://path/to/local/resource.m3u8
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
|
|
||||||
@section concat
|
@section concat
|
||||||
|
|
||||||
Physical concatenation protocol.
|
Physical concatenation protocol.
|
||||||
|
@ -8,9 +8,9 @@ it's a little late for this year's soc (2006).
|
|||||||
|
|
||||||
The Goal:
|
The Goal:
|
||||||
Our goal in respect to soc is and must be of course exactly one thing and
|
Our goal in respect to soc is and must be of course exactly one thing and
|
||||||
that is to improve FFmpeg, to reach this goal, code must
|
that is to improve Libav, to reach this goal, code must
|
||||||
* conform to the development policy and patch submission guidelines
|
* conform to the development policy and patch submission guidelines
|
||||||
* must improve FFmpeg somehow (faster, smaller, "better",
|
* must improve Libav somehow (faster, smaller, "better",
|
||||||
more codecs supported, fewer bugs, cleaner, ...)
|
more codecs supported, fewer bugs, cleaner, ...)
|
||||||
|
|
||||||
for mentors and other developers to help students to reach that goal it is
|
for mentors and other developers to help students to reach that goal it is
|
||||||
@ -20,5 +20,5 @@ easy reviewable that again leads us to:
|
|||||||
* separation of cosmetic from non-cosmetic changes (this is almost entirely
|
* separation of cosmetic from non-cosmetic changes (this is almost entirely
|
||||||
ignored by mentors and students in soc 2006 which might lead to a suprise
|
ignored by mentors and students in soc 2006 which might lead to a suprise
|
||||||
when the code will be reviewed at the end before a possible inclusion in
|
when the code will be reviewed at the end before a possible inclusion in
|
||||||
FFmpeg, individual changes were generally not reviewable due to cosmetics).
|
Libav, individual changes were generally not reviewable due to cosmetics).
|
||||||
* frequent commits, so that comments can be provided early
|
* frequent commits, so that comments can be provided early
|
||||||
|
129
ffserver.c
129
ffserver.c
@ -1861,7 +1861,7 @@ static void fmt_bytecount(AVIOContext *pb, int64_t count)
|
|||||||
|
|
||||||
for (s = suffix; count >= 100000 && s[1]; count /= 1000, s++);
|
for (s = suffix; count >= 100000 && s[1]; count /= 1000, s++);
|
||||||
|
|
||||||
url_fprintf(pb, "%"PRId64"%c", count, *s);
|
avio_printf(pb, "%"PRId64"%c", count, *s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void compute_status(HTTPContext *c)
|
static void compute_status(HTTPContext *c)
|
||||||
@ -1880,20 +1880,20 @@ static void compute_status(HTTPContext *c)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
url_fprintf(pb, "HTTP/1.0 200 OK\r\n");
|
avio_printf(pb, "HTTP/1.0 200 OK\r\n");
|
||||||
url_fprintf(pb, "Content-type: %s\r\n", "text/html");
|
avio_printf(pb, "Content-type: %s\r\n", "text/html");
|
||||||
url_fprintf(pb, "Pragma: no-cache\r\n");
|
avio_printf(pb, "Pragma: no-cache\r\n");
|
||||||
url_fprintf(pb, "\r\n");
|
avio_printf(pb, "\r\n");
|
||||||
|
|
||||||
url_fprintf(pb, "<html><head><title>%s Status</title>\n", program_name);
|
avio_printf(pb, "<html><head><title>%s Status</title>\n", program_name);
|
||||||
if (c->stream->feed_filename[0])
|
if (c->stream->feed_filename[0])
|
||||||
url_fprintf(pb, "<link rel=\"shortcut icon\" href=\"%s\">\n", c->stream->feed_filename);
|
avio_printf(pb, "<link rel=\"shortcut icon\" href=\"%s\">\n", c->stream->feed_filename);
|
||||||
url_fprintf(pb, "</head>\n<body>");
|
avio_printf(pb, "</head>\n<body>");
|
||||||
url_fprintf(pb, "<h1>%s Status</h1>\n", program_name);
|
avio_printf(pb, "<h1>%s Status</h1>\n", program_name);
|
||||||
/* format status */
|
/* format status */
|
||||||
url_fprintf(pb, "<h2>Available Streams</h2>\n");
|
avio_printf(pb, "<h2>Available Streams</h2>\n");
|
||||||
url_fprintf(pb, "<table cellspacing=0 cellpadding=4>\n");
|
avio_printf(pb, "<table cellspacing=0 cellpadding=4>\n");
|
||||||
url_fprintf(pb, "<tr><th valign=top>Path<th align=left>Served<br>Conns<th><br>bytes<th valign=top>Format<th>Bit rate<br>kbits/s<th align=left>Video<br>kbits/s<th><br>Codec<th align=left>Audio<br>kbits/s<th><br>Codec<th align=left valign=top>Feed\n");
|
avio_printf(pb, "<tr><th valign=top>Path<th align=left>Served<br>Conns<th><br>bytes<th valign=top>Format<th>Bit rate<br>kbits/s<th align=left>Video<br>kbits/s<th><br>Codec<th align=left>Audio<br>kbits/s<th><br>Codec<th align=left valign=top>Feed\n");
|
||||||
stream = first_stream;
|
stream = first_stream;
|
||||||
while (stream != NULL) {
|
while (stream != NULL) {
|
||||||
char sfilename[1024];
|
char sfilename[1024];
|
||||||
@ -1921,9 +1921,9 @@ static void compute_status(HTTPContext *c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
url_fprintf(pb, "<tr><td><a href=\"/%s\">%s</a> ",
|
avio_printf(pb, "<tr><td><a href=\"/%s\">%s</a> ",
|
||||||
sfilename, stream->filename);
|
sfilename, stream->filename);
|
||||||
url_fprintf(pb, "<td align=right> %d <td align=right> ",
|
avio_printf(pb, "<td align=right> %d <td align=right> ",
|
||||||
stream->conns_served);
|
stream->conns_served);
|
||||||
fmt_bytecount(pb, stream->bytes_served);
|
fmt_bytecount(pb, stream->bytes_served);
|
||||||
switch(stream->stream_type) {
|
switch(stream->stream_type) {
|
||||||
@ -1962,33 +1962,33 @@ static void compute_status(HTTPContext *c)
|
|||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
url_fprintf(pb, "<td align=center> %s <td align=right> %d <td align=right> %d <td> %s %s <td align=right> %d <td> %s %s",
|
avio_printf(pb, "<td align=center> %s <td align=right> %d <td align=right> %d <td> %s %s <td align=right> %d <td> %s %s",
|
||||||
stream->fmt->name,
|
stream->fmt->name,
|
||||||
stream->bandwidth,
|
stream->bandwidth,
|
||||||
video_bit_rate / 1000, video_codec_name, video_codec_name_extra,
|
video_bit_rate / 1000, video_codec_name, video_codec_name_extra,
|
||||||
audio_bit_rate / 1000, audio_codec_name, audio_codec_name_extra);
|
audio_bit_rate / 1000, audio_codec_name, audio_codec_name_extra);
|
||||||
if (stream->feed)
|
if (stream->feed)
|
||||||
url_fprintf(pb, "<td>%s", stream->feed->filename);
|
avio_printf(pb, "<td>%s", stream->feed->filename);
|
||||||
else
|
else
|
||||||
url_fprintf(pb, "<td>%s", stream->feed_filename);
|
avio_printf(pb, "<td>%s", stream->feed_filename);
|
||||||
url_fprintf(pb, "\n");
|
avio_printf(pb, "\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
url_fprintf(pb, "<td align=center> - <td align=right> - <td align=right> - <td><td align=right> - <td>\n");
|
avio_printf(pb, "<td align=center> - <td align=right> - <td align=right> - <td><td align=right> - <td>\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stream = stream->next;
|
stream = stream->next;
|
||||||
}
|
}
|
||||||
url_fprintf(pb, "</table>\n");
|
avio_printf(pb, "</table>\n");
|
||||||
|
|
||||||
stream = first_stream;
|
stream = first_stream;
|
||||||
while (stream != NULL) {
|
while (stream != NULL) {
|
||||||
if (stream->feed == stream) {
|
if (stream->feed == stream) {
|
||||||
url_fprintf(pb, "<h2>Feed %s</h2>", stream->filename);
|
avio_printf(pb, "<h2>Feed %s</h2>", stream->filename);
|
||||||
if (stream->pid) {
|
if (stream->pid) {
|
||||||
url_fprintf(pb, "Running as pid %d.\n", stream->pid);
|
avio_printf(pb, "Running as pid %d.\n", stream->pid);
|
||||||
|
|
||||||
#if defined(linux) && !defined(CONFIG_NOCUTILS)
|
#if defined(linux) && !defined(CONFIG_NOCUTILS)
|
||||||
{
|
{
|
||||||
@ -2007,7 +2007,7 @@ static void compute_status(HTTPContext *c)
|
|||||||
|
|
||||||
if (fscanf(pid_stat, "%10s %64s", cpuperc,
|
if (fscanf(pid_stat, "%10s %64s", cpuperc,
|
||||||
cpuused) == 2) {
|
cpuused) == 2) {
|
||||||
url_fprintf(pb, "Currently using %s%% of the cpu. Total time used %s.\n",
|
avio_printf(pb, "Currently using %s%% of the cpu. Total time used %s.\n",
|
||||||
cpuperc, cpuused);
|
cpuperc, cpuused);
|
||||||
}
|
}
|
||||||
fclose(pid_stat);
|
fclose(pid_stat);
|
||||||
@ -2015,9 +2015,9 @@ static void compute_status(HTTPContext *c)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
url_fprintf(pb, "<p>");
|
avio_printf(pb, "<p>");
|
||||||
}
|
}
|
||||||
url_fprintf(pb, "<table cellspacing=0 cellpadding=4><tr><th>Stream<th>type<th>kbits/s<th align=left>codec<th align=left>Parameters\n");
|
avio_printf(pb, "<table cellspacing=0 cellpadding=4><tr><th>Stream<th>type<th>kbits/s<th align=left>codec<th align=left>Parameters\n");
|
||||||
|
|
||||||
for (i = 0; i < stream->nb_streams; i++) {
|
for (i = 0; i < stream->nb_streams; i++) {
|
||||||
AVStream *st = stream->streams[i];
|
AVStream *st = stream->streams[i];
|
||||||
@ -2040,26 +2040,26 @@ static void compute_status(HTTPContext *c)
|
|||||||
default:
|
default:
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
url_fprintf(pb, "<tr><td align=right>%d<td>%s<td align=right>%d<td>%s<td>%s\n",
|
avio_printf(pb, "<tr><td align=right>%d<td>%s<td align=right>%d<td>%s<td>%s\n",
|
||||||
i, type, st->codec->bit_rate/1000, codec ? codec->name : "", parameters);
|
i, type, st->codec->bit_rate/1000, codec ? codec->name : "", parameters);
|
||||||
}
|
}
|
||||||
url_fprintf(pb, "</table>\n");
|
avio_printf(pb, "</table>\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
stream = stream->next;
|
stream = stream->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* connection status */
|
/* connection status */
|
||||||
url_fprintf(pb, "<h2>Connection Status</h2>\n");
|
avio_printf(pb, "<h2>Connection Status</h2>\n");
|
||||||
|
|
||||||
url_fprintf(pb, "Number of connections: %d / %d<br>\n",
|
avio_printf(pb, "Number of connections: %d / %d<br>\n",
|
||||||
nb_connections, nb_max_connections);
|
nb_connections, nb_max_connections);
|
||||||
|
|
||||||
url_fprintf(pb, "Bandwidth in use: %"PRIu64"k / %"PRIu64"k<br>\n",
|
avio_printf(pb, "Bandwidth in use: %"PRIu64"k / %"PRIu64"k<br>\n",
|
||||||
current_bandwidth, max_bandwidth);
|
current_bandwidth, max_bandwidth);
|
||||||
|
|
||||||
url_fprintf(pb, "<table>\n");
|
avio_printf(pb, "<table>\n");
|
||||||
url_fprintf(pb, "<tr><th>#<th>File<th>IP<th>Proto<th>State<th>Target bits/sec<th>Actual bits/sec<th>Bytes transferred\n");
|
avio_printf(pb, "<tr><th>#<th>File<th>IP<th>Proto<th>State<th>Target bits/sec<th>Actual bits/sec<th>Bytes transferred\n");
|
||||||
c1 = first_http_ctx;
|
c1 = first_http_ctx;
|
||||||
i = 0;
|
i = 0;
|
||||||
while (c1 != NULL) {
|
while (c1 != NULL) {
|
||||||
@ -2078,7 +2078,7 @@ static void compute_status(HTTPContext *c)
|
|||||||
|
|
||||||
i++;
|
i++;
|
||||||
p = inet_ntoa(c1->from_addr.sin_addr);
|
p = inet_ntoa(c1->from_addr.sin_addr);
|
||||||
url_fprintf(pb, "<tr><td><b>%d</b><td>%s%s<td>%s<td>%s<td>%s<td align=right>",
|
avio_printf(pb, "<tr><td><b>%d</b><td>%s%s<td>%s<td>%s<td>%s<td align=right>",
|
||||||
i,
|
i,
|
||||||
c1->stream ? c1->stream->filename : "",
|
c1->stream ? c1->stream->filename : "",
|
||||||
c1->state == HTTPSTATE_RECEIVE_DATA ? "(input)" : "",
|
c1->state == HTTPSTATE_RECEIVE_DATA ? "(input)" : "",
|
||||||
@ -2086,20 +2086,20 @@ static void compute_status(HTTPContext *c)
|
|||||||
c1->protocol,
|
c1->protocol,
|
||||||
http_state[c1->state]);
|
http_state[c1->state]);
|
||||||
fmt_bytecount(pb, bitrate);
|
fmt_bytecount(pb, bitrate);
|
||||||
url_fprintf(pb, "<td align=right>");
|
avio_printf(pb, "<td align=right>");
|
||||||
fmt_bytecount(pb, compute_datarate(&c1->datarate, c1->data_count) * 8);
|
fmt_bytecount(pb, compute_datarate(&c1->datarate, c1->data_count) * 8);
|
||||||
url_fprintf(pb, "<td align=right>");
|
avio_printf(pb, "<td align=right>");
|
||||||
fmt_bytecount(pb, c1->data_count);
|
fmt_bytecount(pb, c1->data_count);
|
||||||
url_fprintf(pb, "\n");
|
avio_printf(pb, "\n");
|
||||||
c1 = c1->next;
|
c1 = c1->next;
|
||||||
}
|
}
|
||||||
url_fprintf(pb, "</table>\n");
|
avio_printf(pb, "</table>\n");
|
||||||
|
|
||||||
/* date */
|
/* date */
|
||||||
ti = time(NULL);
|
ti = time(NULL);
|
||||||
p = ctime(&ti);
|
p = ctime(&ti);
|
||||||
url_fprintf(pb, "<hr size=1 noshade>Generated at %s", p);
|
avio_printf(pb, "<hr size=1 noshade>Generated at %s", p);
|
||||||
url_fprintf(pb, "</body>\n</html>\n");
|
avio_printf(pb, "</body>\n</html>\n");
|
||||||
|
|
||||||
len = url_close_dyn_buf(pb, &c->pb_buffer);
|
len = url_close_dyn_buf(pb, &c->pb_buffer);
|
||||||
c->buffer_ptr = c->pb_buffer;
|
c->buffer_ptr = c->pb_buffer;
|
||||||
@ -2721,7 +2721,8 @@ static int http_receive_data(HTTPContext *c)
|
|||||||
if (!fmt_in)
|
if (!fmt_in)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
url_open_buf(&pb, c->buffer, c->buffer_end - c->buffer, URL_RDONLY);
|
pb = avio_alloc_context(c->buffer, c->buffer_end - c->buffer,
|
||||||
|
0, NULL, NULL, NULL, NULL);
|
||||||
pb->is_streamed = 1;
|
pb->is_streamed = 1;
|
||||||
|
|
||||||
if (av_open_input_stream(&s, pb, c->stream->feed_filename, fmt_in, NULL) < 0) {
|
if (av_open_input_stream(&s, pb, c->stream->feed_filename, fmt_in, NULL) < 0) {
|
||||||
@ -2812,20 +2813,20 @@ static void rtsp_reply_header(HTTPContext *c, enum RTSPStatusCode error_number)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
url_fprintf(c->pb, "RTSP/1.0 %d %s\r\n", error_number, str);
|
avio_printf(c->pb, "RTSP/1.0 %d %s\r\n", error_number, str);
|
||||||
url_fprintf(c->pb, "CSeq: %d\r\n", c->seq);
|
avio_printf(c->pb, "CSeq: %d\r\n", c->seq);
|
||||||
|
|
||||||
/* output GMT time */
|
/* output GMT time */
|
||||||
ti = time(NULL);
|
ti = time(NULL);
|
||||||
tm = gmtime(&ti);
|
tm = gmtime(&ti);
|
||||||
strftime(buf2, sizeof(buf2), "%a, %d %b %Y %H:%M:%S", tm);
|
strftime(buf2, sizeof(buf2), "%a, %d %b %Y %H:%M:%S", tm);
|
||||||
url_fprintf(c->pb, "Date: %s GMT\r\n", buf2);
|
avio_printf(c->pb, "Date: %s GMT\r\n", buf2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rtsp_reply_error(HTTPContext *c, enum RTSPStatusCode error_number)
|
static void rtsp_reply_error(HTTPContext *c, enum RTSPStatusCode error_number)
|
||||||
{
|
{
|
||||||
rtsp_reply_header(c, error_number);
|
rtsp_reply_header(c, error_number);
|
||||||
url_fprintf(c->pb, "\r\n");
|
avio_printf(c->pb, "\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rtsp_parse_request(HTTPContext *c)
|
static int rtsp_parse_request(HTTPContext *c)
|
||||||
@ -2970,10 +2971,10 @@ static int prepare_sdp_description(FFStream *stream, uint8_t **pbuffer,
|
|||||||
static void rtsp_cmd_options(HTTPContext *c, const char *url)
|
static void rtsp_cmd_options(HTTPContext *c, const char *url)
|
||||||
{
|
{
|
||||||
// rtsp_reply_header(c, RTSP_STATUS_OK);
|
// rtsp_reply_header(c, RTSP_STATUS_OK);
|
||||||
url_fprintf(c->pb, "RTSP/1.0 %d %s\r\n", RTSP_STATUS_OK, "OK");
|
avio_printf(c->pb, "RTSP/1.0 %d %s\r\n", RTSP_STATUS_OK, "OK");
|
||||||
url_fprintf(c->pb, "CSeq: %d\r\n", c->seq);
|
avio_printf(c->pb, "CSeq: %d\r\n", c->seq);
|
||||||
url_fprintf(c->pb, "Public: %s\r\n", "OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE");
|
avio_printf(c->pb, "Public: %s\r\n", "OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE");
|
||||||
url_fprintf(c->pb, "\r\n");
|
avio_printf(c->pb, "\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rtsp_cmd_describe(HTTPContext *c, const char *url)
|
static void rtsp_cmd_describe(HTTPContext *c, const char *url)
|
||||||
@ -3014,10 +3015,10 @@ static void rtsp_cmd_describe(HTTPContext *c, const char *url)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
rtsp_reply_header(c, RTSP_STATUS_OK);
|
rtsp_reply_header(c, RTSP_STATUS_OK);
|
||||||
url_fprintf(c->pb, "Content-Base: %s/\r\n", url);
|
avio_printf(c->pb, "Content-Base: %s/\r\n", url);
|
||||||
url_fprintf(c->pb, "Content-Type: application/sdp\r\n");
|
avio_printf(c->pb, "Content-Type: application/sdp\r\n");
|
||||||
url_fprintf(c->pb, "Content-Length: %d\r\n", content_length);
|
avio_printf(c->pb, "Content-Length: %d\r\n", content_length);
|
||||||
url_fprintf(c->pb, "\r\n");
|
avio_printf(c->pb, "\r\n");
|
||||||
avio_write(c->pb, content, content_length);
|
avio_write(c->pb, content, content_length);
|
||||||
av_free(content);
|
av_free(content);
|
||||||
}
|
}
|
||||||
@ -3163,30 +3164,30 @@ static void rtsp_cmd_setup(HTTPContext *c, const char *url,
|
|||||||
/* now everything is OK, so we can send the connection parameters */
|
/* now everything is OK, so we can send the connection parameters */
|
||||||
rtsp_reply_header(c, RTSP_STATUS_OK);
|
rtsp_reply_header(c, RTSP_STATUS_OK);
|
||||||
/* session ID */
|
/* session ID */
|
||||||
url_fprintf(c->pb, "Session: %s\r\n", rtp_c->session_id);
|
avio_printf(c->pb, "Session: %s\r\n", rtp_c->session_id);
|
||||||
|
|
||||||
switch(rtp_c->rtp_protocol) {
|
switch(rtp_c->rtp_protocol) {
|
||||||
case RTSP_LOWER_TRANSPORT_UDP:
|
case RTSP_LOWER_TRANSPORT_UDP:
|
||||||
rtp_port = rtp_get_local_rtp_port(rtp_c->rtp_handles[stream_index]);
|
rtp_port = rtp_get_local_rtp_port(rtp_c->rtp_handles[stream_index]);
|
||||||
rtcp_port = rtp_get_local_rtcp_port(rtp_c->rtp_handles[stream_index]);
|
rtcp_port = rtp_get_local_rtcp_port(rtp_c->rtp_handles[stream_index]);
|
||||||
url_fprintf(c->pb, "Transport: RTP/AVP/UDP;unicast;"
|
avio_printf(c->pb, "Transport: RTP/AVP/UDP;unicast;"
|
||||||
"client_port=%d-%d;server_port=%d-%d",
|
"client_port=%d-%d;server_port=%d-%d",
|
||||||
th->client_port_min, th->client_port_max,
|
th->client_port_min, th->client_port_max,
|
||||||
rtp_port, rtcp_port);
|
rtp_port, rtcp_port);
|
||||||
break;
|
break;
|
||||||
case RTSP_LOWER_TRANSPORT_TCP:
|
case RTSP_LOWER_TRANSPORT_TCP:
|
||||||
url_fprintf(c->pb, "Transport: RTP/AVP/TCP;interleaved=%d-%d",
|
avio_printf(c->pb, "Transport: RTP/AVP/TCP;interleaved=%d-%d",
|
||||||
stream_index * 2, stream_index * 2 + 1);
|
stream_index * 2, stream_index * 2 + 1);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (setup.transport_option[0] != '\0')
|
if (setup.transport_option[0] != '\0')
|
||||||
url_fprintf(c->pb, ";%s", setup.transport_option);
|
avio_printf(c->pb, ";%s", setup.transport_option);
|
||||||
url_fprintf(c->pb, "\r\n");
|
avio_printf(c->pb, "\r\n");
|
||||||
|
|
||||||
|
|
||||||
url_fprintf(c->pb, "\r\n");
|
avio_printf(c->pb, "\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3248,8 +3249,8 @@ static void rtsp_cmd_play(HTTPContext *c, const char *url, RTSPMessageHeader *h)
|
|||||||
/* now everything is OK, so we can send the connection parameters */
|
/* now everything is OK, so we can send the connection parameters */
|
||||||
rtsp_reply_header(c, RTSP_STATUS_OK);
|
rtsp_reply_header(c, RTSP_STATUS_OK);
|
||||||
/* session ID */
|
/* session ID */
|
||||||
url_fprintf(c->pb, "Session: %s\r\n", rtp_c->session_id);
|
avio_printf(c->pb, "Session: %s\r\n", rtp_c->session_id);
|
||||||
url_fprintf(c->pb, "\r\n");
|
avio_printf(c->pb, "\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rtsp_cmd_pause(HTTPContext *c, const char *url, RTSPMessageHeader *h)
|
static void rtsp_cmd_pause(HTTPContext *c, const char *url, RTSPMessageHeader *h)
|
||||||
@ -3273,8 +3274,8 @@ static void rtsp_cmd_pause(HTTPContext *c, const char *url, RTSPMessageHeader *h
|
|||||||
/* now everything is OK, so we can send the connection parameters */
|
/* now everything is OK, so we can send the connection parameters */
|
||||||
rtsp_reply_header(c, RTSP_STATUS_OK);
|
rtsp_reply_header(c, RTSP_STATUS_OK);
|
||||||
/* session ID */
|
/* session ID */
|
||||||
url_fprintf(c->pb, "Session: %s\r\n", rtp_c->session_id);
|
avio_printf(c->pb, "Session: %s\r\n", rtp_c->session_id);
|
||||||
url_fprintf(c->pb, "\r\n");
|
avio_printf(c->pb, "\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rtsp_cmd_teardown(HTTPContext *c, const char *url, RTSPMessageHeader *h)
|
static void rtsp_cmd_teardown(HTTPContext *c, const char *url, RTSPMessageHeader *h)
|
||||||
@ -3296,8 +3297,8 @@ static void rtsp_cmd_teardown(HTTPContext *c, const char *url, RTSPMessageHeader
|
|||||||
/* now everything is OK, so we can send the connection parameters */
|
/* now everything is OK, so we can send the connection parameters */
|
||||||
rtsp_reply_header(c, RTSP_STATUS_OK);
|
rtsp_reply_header(c, RTSP_STATUS_OK);
|
||||||
/* session ID */
|
/* session ID */
|
||||||
url_fprintf(c->pb, "Session: %s\r\n", session_id);
|
avio_printf(c->pb, "Session: %s\r\n", session_id);
|
||||||
url_fprintf(c->pb, "\r\n");
|
avio_printf(c->pb, "\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -146,34 +146,34 @@ static av_always_inline float quantize_and_encode_band_cost_template(
|
|||||||
curidx *= range;
|
curidx *= range;
|
||||||
curidx += quants[j] + off;
|
curidx += quants[j] + off;
|
||||||
}
|
}
|
||||||
curbits = ff_aac_spectral_bits[cb-1][curidx];
|
curbits = ff_aac_spectral_bits[cb-1][curidx];
|
||||||
vec = &ff_aac_codebook_vectors[cb-1][curidx*dim];
|
vec = &ff_aac_codebook_vectors[cb-1][curidx*dim];
|
||||||
if (BT_UNSIGNED) {
|
if (BT_UNSIGNED) {
|
||||||
for (k = 0; k < dim; k++) {
|
for (k = 0; k < dim; k++) {
|
||||||
float t = fabsf(in[i+k]);
|
float t = fabsf(in[i+k]);
|
||||||
float di;
|
float di;
|
||||||
if (BT_ESC && vec[k] == 64.0f) { //FIXME: slow
|
if (BT_ESC && vec[k] == 64.0f) { //FIXME: slow
|
||||||
if (t >= CLIPPED_ESCAPE) {
|
if (t >= CLIPPED_ESCAPE) {
|
||||||
di = t - CLIPPED_ESCAPE;
|
di = t - CLIPPED_ESCAPE;
|
||||||
curbits += 21;
|
curbits += 21;
|
||||||
} else {
|
|
||||||
int c = av_clip(quant(t, Q), 0, 8191);
|
|
||||||
di = t - c*cbrtf(c)*IQ;
|
|
||||||
curbits += av_log2(c)*2 - 4 + 1;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
di = t - vec[k]*IQ;
|
int c = av_clip(quant(t, Q), 0, 8191);
|
||||||
|
di = t - c*cbrtf(c)*IQ;
|
||||||
|
curbits += av_log2(c)*2 - 4 + 1;
|
||||||
}
|
}
|
||||||
if (vec[k] != 0.0f)
|
} else {
|
||||||
curbits++;
|
di = t - vec[k]*IQ;
|
||||||
rd += di*di;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (k = 0; k < dim; k++) {
|
|
||||||
float di = in[i+k] - vec[k]*IQ;
|
|
||||||
rd += di*di;
|
|
||||||
}
|
}
|
||||||
|
if (vec[k] != 0.0f)
|
||||||
|
curbits++;
|
||||||
|
rd += di*di;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
for (k = 0; k < dim; k++) {
|
||||||
|
float di = in[i+k] - vec[k]*IQ;
|
||||||
|
rd += di*di;
|
||||||
|
}
|
||||||
|
}
|
||||||
cost += rd * lambda + curbits;
|
cost += rd * lambda + curbits;
|
||||||
resbits += curbits;
|
resbits += curbits;
|
||||||
if (cost >= uplim)
|
if (cost >= uplim)
|
||||||
@ -575,7 +575,7 @@ static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s,
|
|||||||
int qnrg = av_clip_uint8(log2f(sqrtf(qnrgf/qcnt))*4 - 31 + SCALE_ONE_POS - SCALE_DIV_512);
|
int qnrg = av_clip_uint8(log2f(sqrtf(qnrgf/qcnt))*4 - 31 + SCALE_ONE_POS - SCALE_DIV_512);
|
||||||
q1 = qnrg + 30;
|
q1 = qnrg + 30;
|
||||||
q0 = qnrg - 30;
|
q0 = qnrg - 30;
|
||||||
//av_log(NULL, AV_LOG_ERROR, "q0 %d, q1 %d\n", q0, q1);
|
//av_log(NULL, AV_LOG_ERROR, "q0 %d, q1 %d\n", q0, q1);
|
||||||
if (q0 < q0low) {
|
if (q0 < q0low) {
|
||||||
q1 += q0low - q0;
|
q1 += q0low - q0;
|
||||||
q0 = q0low;
|
q0 = q0low;
|
||||||
@ -723,7 +723,7 @@ static void search_for_quantizers_twoloop(AVCodecContext *avctx,
|
|||||||
sce->zeroes[w*16+g] = !nz;
|
sce->zeroes[w*16+g] = !nz;
|
||||||
if (nz)
|
if (nz)
|
||||||
minthr = FFMIN(minthr, uplim);
|
minthr = FFMIN(minthr, uplim);
|
||||||
allz = FFMAX(allz, nz);
|
allz |= nz;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
|
for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
|
||||||
|
@ -39,8 +39,8 @@
|
|||||||
* constants for 3GPP AAC psychoacoustic model
|
* constants for 3GPP AAC psychoacoustic model
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
#define PSY_3GPP_SPREAD_HI 1.5f // spreading factor for ascending threshold spreading (15 dB/Bark)
|
#define PSY_3GPP_THR_SPREAD_HI 1.5f // spreading factor for low-to-hi threshold spreading (15 dB/Bark)
|
||||||
#define PSY_3GPP_SPREAD_LOW 3.0f // spreading factor for descending threshold spreading (30 dB/Bark)
|
#define PSY_3GPP_THR_SPREAD_LOW 3.0f // spreading factor for hi-to-low threshold spreading (30 dB/Bark)
|
||||||
|
|
||||||
#define PSY_3GPP_RPEMIN 0.01f
|
#define PSY_3GPP_RPEMIN 0.01f
|
||||||
#define PSY_3GPP_RPELEV 2.0f
|
#define PSY_3GPP_RPELEV 2.0f
|
||||||
@ -61,9 +61,7 @@
|
|||||||
*/
|
*/
|
||||||
typedef struct AacPsyBand{
|
typedef struct AacPsyBand{
|
||||||
float energy; ///< band energy
|
float energy; ///< band energy
|
||||||
float ffac; ///< form factor
|
|
||||||
float thr; ///< energy threshold
|
float thr; ///< energy threshold
|
||||||
float min_snr; ///< minimal SNR
|
|
||||||
float thr_quiet; ///< threshold in quiet
|
float thr_quiet; ///< threshold in quiet
|
||||||
}AacPsyBand;
|
}AacPsyBand;
|
||||||
|
|
||||||
@ -88,17 +86,18 @@ typedef struct AacPsyChannel{
|
|||||||
* psychoacoustic model frame type-dependent coefficients
|
* psychoacoustic model frame type-dependent coefficients
|
||||||
*/
|
*/
|
||||||
typedef struct AacPsyCoeffs{
|
typedef struct AacPsyCoeffs{
|
||||||
float ath [64]; ///< absolute threshold of hearing per bands
|
float ath; ///< absolute threshold of hearing per bands
|
||||||
float barks [64]; ///< Bark value for each spectral band in long frame
|
float barks; ///< Bark value for each spectral band in long frame
|
||||||
float spread_low[64]; ///< spreading factor for low-to-high threshold spreading in long frame
|
float spread_low[2]; ///< spreading factor for low-to-high threshold spreading in long frame
|
||||||
float spread_hi [64]; ///< spreading factor for high-to-low threshold spreading in long frame
|
float spread_hi [2]; ///< spreading factor for high-to-low threshold spreading in long frame
|
||||||
|
float min_snr; ///< minimal SNR
|
||||||
}AacPsyCoeffs;
|
}AacPsyCoeffs;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 3GPP TS26.403-inspired psychoacoustic model specific data
|
* 3GPP TS26.403-inspired psychoacoustic model specific data
|
||||||
*/
|
*/
|
||||||
typedef struct AacPsyContext{
|
typedef struct AacPsyContext{
|
||||||
AacPsyCoeffs psy_coef[2];
|
AacPsyCoeffs psy_coef[2][64];
|
||||||
AacPsyChannel *ch;
|
AacPsyChannel *ch;
|
||||||
}AacPsyContext;
|
}AacPsyContext;
|
||||||
|
|
||||||
@ -243,27 +242,30 @@ static av_cold int psy_3gpp_init(FFPsyContext *ctx) {
|
|||||||
|
|
||||||
minath = ath(3410, ATH_ADD);
|
minath = ath(3410, ATH_ADD);
|
||||||
for (j = 0; j < 2; j++) {
|
for (j = 0; j < 2; j++) {
|
||||||
AacPsyCoeffs *coeffs = &pctx->psy_coef[j];
|
AacPsyCoeffs *coeffs = pctx->psy_coef[j];
|
||||||
|
const uint8_t *band_sizes = ctx->bands[j];
|
||||||
float line_to_frequency = ctx->avctx->sample_rate / (j ? 256.f : 2048.0f);
|
float line_to_frequency = ctx->avctx->sample_rate / (j ? 256.f : 2048.0f);
|
||||||
i = 0;
|
i = 0;
|
||||||
prev = 0.0;
|
prev = 0.0;
|
||||||
for (g = 0; g < ctx->num_bands[j]; g++) {
|
for (g = 0; g < ctx->num_bands[j]; g++) {
|
||||||
i += ctx->bands[j][g];
|
i += band_sizes[g];
|
||||||
bark = calc_bark((i-1) * line_to_frequency);
|
bark = calc_bark((i-1) * line_to_frequency);
|
||||||
coeffs->barks[g] = (bark + prev) / 2.0;
|
coeffs[g].barks = (bark + prev) / 2.0;
|
||||||
prev = bark;
|
prev = bark;
|
||||||
}
|
}
|
||||||
for (g = 0; g < ctx->num_bands[j] - 1; g++) {
|
for (g = 0; g < ctx->num_bands[j] - 1; g++) {
|
||||||
coeffs->spread_low[g] = pow(10.0, -(coeffs->barks[g+1] - coeffs->barks[g]) * PSY_3GPP_SPREAD_LOW);
|
AacPsyCoeffs *coeff = &coeffs[g];
|
||||||
coeffs->spread_hi [g] = pow(10.0, -(coeffs->barks[g+1] - coeffs->barks[g]) * PSY_3GPP_SPREAD_HI);
|
float bark_width = coeffs[g+1].barks - coeffs->barks;
|
||||||
|
coeff->spread_low[0] = pow(10.0, -bark_width * PSY_3GPP_THR_SPREAD_LOW);
|
||||||
|
coeff->spread_hi [0] = pow(10.0, -bark_width * PSY_3GPP_THR_SPREAD_HI);
|
||||||
}
|
}
|
||||||
start = 0;
|
start = 0;
|
||||||
for (g = 0; g < ctx->num_bands[j]; g++) {
|
for (g = 0; g < ctx->num_bands[j]; g++) {
|
||||||
minscale = ath(start * line_to_frequency, ATH_ADD);
|
minscale = ath(start * line_to_frequency, ATH_ADD);
|
||||||
for (i = 1; i < ctx->bands[j][g]; i++)
|
for (i = 1; i < band_sizes[g]; i++)
|
||||||
minscale = FFMIN(minscale, ath((start + i) * line_to_frequency, ATH_ADD));
|
minscale = FFMIN(minscale, ath((start + i) * line_to_frequency, ATH_ADD));
|
||||||
coeffs->ath[g] = minscale - minath;
|
coeffs[g].ath = minscale - minath;
|
||||||
start += ctx->bands[j][g];
|
start += band_sizes[g];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -393,9 +395,9 @@ static void psy_3gpp_analyze(FFPsyContext *ctx, int channel,
|
|||||||
AacPsyChannel *pch = &pctx->ch[channel];
|
AacPsyChannel *pch = &pctx->ch[channel];
|
||||||
int start = 0;
|
int start = 0;
|
||||||
int i, w, g;
|
int i, w, g;
|
||||||
const int num_bands = ctx->num_bands[wi->num_windows == 8];
|
const int num_bands = ctx->num_bands[wi->num_windows == 8];
|
||||||
const uint8_t* band_sizes = ctx->bands[wi->num_windows == 8];
|
const uint8_t *band_sizes = ctx->bands[wi->num_windows == 8];
|
||||||
AacPsyCoeffs *coeffs = &pctx->psy_coef[wi->num_windows == 8];
|
AacPsyCoeffs *coeffs = &pctx->psy_coef[wi->num_windows == 8];
|
||||||
|
|
||||||
//calculate energies, initial thresholds and related values - 5.4.2 "Threshold Calculation"
|
//calculate energies, initial thresholds and related values - 5.4.2 "Threshold Calculation"
|
||||||
for (w = 0; w < wi->num_windows*16; w += 16) {
|
for (w = 0; w < wi->num_windows*16; w += 16) {
|
||||||
@ -406,26 +408,37 @@ static void psy_3gpp_analyze(FFPsyContext *ctx, int channel,
|
|||||||
band->energy += coefs[start+i] * coefs[start+i];
|
band->energy += coefs[start+i] * coefs[start+i];
|
||||||
band->thr = band->energy * 0.001258925f;
|
band->thr = band->energy * 0.001258925f;
|
||||||
start += band_sizes[g];
|
start += band_sizes[g];
|
||||||
|
|
||||||
ctx->psy_bands[channel*PSY_MAX_BANDS+w+g].energy = band->energy;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//modify thresholds - spread, threshold in quiet - 5.4.3 "Spreaded Energy Calculation"
|
//modify thresholds and energies - spread, threshold in quiet, pre-echo control
|
||||||
for (w = 0; w < wi->num_windows*16; w += 16) {
|
for (w = 0; w < wi->num_windows*16; w += 16) {
|
||||||
AacPsyBand *band = &pch->band[w];
|
AacPsyBand *bands = &pch->band[w];
|
||||||
|
//5.4.2.3 "Spreading" & 5.4.3 "Spreaded Energy Calculation"
|
||||||
for (g = 1; g < num_bands; g++)
|
for (g = 1; g < num_bands; g++)
|
||||||
band[g].thr = FFMAX(band[g].thr, band[g-1].thr * coeffs->spread_hi [g]);
|
bands[g].thr = FFMAX(bands[g].thr, bands[g-1].thr * coeffs[g].spread_hi[0]);
|
||||||
for (g = num_bands - 2; g >= 0; g--)
|
for (g = num_bands - 2; g >= 0; g--)
|
||||||
band[g].thr = FFMAX(band[g].thr, band[g+1].thr * coeffs->spread_low[g]);
|
bands[g].thr = FFMAX(bands[g].thr, bands[g+1].thr * coeffs[g].spread_low[0]);
|
||||||
|
//5.4.2.4 "Threshold in quiet"
|
||||||
for (g = 0; g < num_bands; g++) {
|
for (g = 0; g < num_bands; g++) {
|
||||||
band[g].thr_quiet = band[g].thr = FFMAX(band[g].thr, coeffs->ath[g]);
|
AacPsyBand *band = &bands[g];
|
||||||
|
band->thr_quiet = band->thr = FFMAX(band->thr, coeffs[g].ath);
|
||||||
|
//5.4.2.5 "Pre-echo control"
|
||||||
if (!(wi->window_type[0] == LONG_STOP_SEQUENCE || (wi->window_type[1] == LONG_START_SEQUENCE && !w)))
|
if (!(wi->window_type[0] == LONG_STOP_SEQUENCE || (wi->window_type[1] == LONG_START_SEQUENCE && !w)))
|
||||||
band[g].thr = FFMAX(PSY_3GPP_RPEMIN*band[g].thr, FFMIN(band[g].thr,
|
band->thr = FFMAX(PSY_3GPP_RPEMIN*band->thr, FFMIN(band->thr,
|
||||||
PSY_3GPP_RPELEV*pch->prev_band[w+g].thr_quiet));
|
PSY_3GPP_RPELEV*pch->prev_band[w+g].thr_quiet));
|
||||||
|
|
||||||
ctx->psy_bands[channel*PSY_MAX_BANDS+w+g].threshold = band[g].thr;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (w = 0; w < wi->num_windows*16; w += 16) {
|
||||||
|
for (g = 0; g < num_bands; g++) {
|
||||||
|
AacPsyBand *band = &pch->band[w+g];
|
||||||
|
FFPsyBand *psy_band = &ctx->psy_bands[channel*PSY_MAX_BANDS+w+g];
|
||||||
|
|
||||||
|
psy_band->threshold = band->thr;
|
||||||
|
psy_band->energy = band->energy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(pch->prev_band, pch->band, sizeof(pch->band));
|
memcpy(pch->prev_band, pch->band, sizeof(pch->band));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -553,22 +566,9 @@ static FFPsyWindowInfo psy_lame_window(FFPsyContext *ctx,
|
|||||||
if (pch->prev_attack == 3 || att_sum) {
|
if (pch->prev_attack == 3 || att_sum) {
|
||||||
uselongblock = 0;
|
uselongblock = 0;
|
||||||
|
|
||||||
if (attacks[1] && attacks[0])
|
for (i = 1; i < AAC_NUM_BLOCKS_SHORT + 1; i++)
|
||||||
attacks[1] = 0;
|
if (attacks[i] && attacks[i-1])
|
||||||
if (attacks[2] && attacks[1])
|
attacks[i] = 0;
|
||||||
attacks[2] = 0;
|
|
||||||
if (attacks[3] && attacks[2])
|
|
||||||
attacks[3] = 0;
|
|
||||||
if (attacks[4] && attacks[3])
|
|
||||||
attacks[4] = 0;
|
|
||||||
if (attacks[5] && attacks[4])
|
|
||||||
attacks[5] = 0;
|
|
||||||
if (attacks[6] && attacks[5])
|
|
||||||
attacks[6] = 0;
|
|
||||||
if (attacks[7] && attacks[6])
|
|
||||||
attacks[7] = 0;
|
|
||||||
if (attacks[8] && attacks[7])
|
|
||||||
attacks[8] = 0;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* We have no lookahead info, so just use same type as the previous sequence. */
|
/* We have no lookahead info, so just use same type as the previous sequence. */
|
||||||
|
@ -222,6 +222,12 @@ static void bswap_buf(uint32_t *dst, const uint32_t *src, int w){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void bswap16_buf(uint16_t *dst, const uint16_t *src, int len)
|
||||||
|
{
|
||||||
|
while (len--)
|
||||||
|
*dst++ = av_bswap16(*src++);
|
||||||
|
}
|
||||||
|
|
||||||
static int sse4_c(void *v, uint8_t * pix1, uint8_t * pix2, int line_size, int h)
|
static int sse4_c(void *v, uint8_t * pix1, uint8_t * pix2, int line_size, int h)
|
||||||
{
|
{
|
||||||
int s, i;
|
int s, i;
|
||||||
@ -4324,6 +4330,7 @@ av_cold void dsputil_init(DSPContext* c, AVCodecContext *avctx)
|
|||||||
c->add_hfyu_left_prediction = add_hfyu_left_prediction_c;
|
c->add_hfyu_left_prediction = add_hfyu_left_prediction_c;
|
||||||
c->add_hfyu_left_prediction_bgr32 = add_hfyu_left_prediction_bgr32_c;
|
c->add_hfyu_left_prediction_bgr32 = add_hfyu_left_prediction_bgr32_c;
|
||||||
c->bswap_buf= bswap_buf;
|
c->bswap_buf= bswap_buf;
|
||||||
|
c->bswap16_buf = bswap16_buf;
|
||||||
#if CONFIG_PNG_DECODER
|
#if CONFIG_PNG_DECODER
|
||||||
c->add_png_paeth_prediction= ff_add_png_paeth_prediction;
|
c->add_png_paeth_prediction= ff_add_png_paeth_prediction;
|
||||||
#endif
|
#endif
|
||||||
|
@ -369,6 +369,7 @@ typedef struct DSPContext {
|
|||||||
/* this might write to dst[w] */
|
/* this might write to dst[w] */
|
||||||
void (*add_png_paeth_prediction)(uint8_t *dst, uint8_t *src, uint8_t *top, int w, int bpp);
|
void (*add_png_paeth_prediction)(uint8_t *dst, uint8_t *src, uint8_t *top, int w, int bpp);
|
||||||
void (*bswap_buf)(uint32_t *dst, const uint32_t *src, int w);
|
void (*bswap_buf)(uint32_t *dst, const uint32_t *src, int w);
|
||||||
|
void (*bswap16_buf)(uint16_t *dst, const uint16_t *src, int len);
|
||||||
|
|
||||||
void (*h263_v_loop_filter)(uint8_t *src, int stride, int qscale);
|
void (*h263_v_loop_filter)(uint8_t *src, int stride, int qscale);
|
||||||
void (*h263_h_loop_filter)(uint8_t *src, int stride, int qscale);
|
void (*h263_h_loop_filter)(uint8_t *src, int stride, int qscale);
|
||||||
|
@ -1078,13 +1078,13 @@ unsigned avcodec_version( void )
|
|||||||
|
|
||||||
const char *avcodec_configuration(void)
|
const char *avcodec_configuration(void)
|
||||||
{
|
{
|
||||||
return FFMPEG_CONFIGURATION;
|
return LIBAV_CONFIGURATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *avcodec_license(void)
|
const char *avcodec_license(void)
|
||||||
{
|
{
|
||||||
#define LICENSE_PREFIX "libavcodec license: "
|
#define LICENSE_PREFIX "libavcodec license: "
|
||||||
return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
|
return LICENSE_PREFIX LIBAV_LICENSE + sizeof(LICENSE_PREFIX) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void avcodec_init(void)
|
void avcodec_init(void)
|
||||||
|
@ -26,24 +26,45 @@
|
|||||||
#include "libavutil/common.h"
|
#include "libavutil/common.h"
|
||||||
|
|
||||||
#if ARCH_X86_32
|
#if ARCH_X86_32
|
||||||
#define MULL(ra, rb, shift) \
|
|
||||||
({ int rt, dummy; __asm__ (\
|
|
||||||
"imull %3 \n\t"\
|
|
||||||
"shrdl %4, %%edx, %%eax \n\t"\
|
|
||||||
: "=a"(rt), "=d"(dummy)\
|
|
||||||
: "a" ((int)(ra)), "rm" ((int)(rb)), "i"(shift));\
|
|
||||||
rt; })
|
|
||||||
|
|
||||||
#define MULH(ra, rb) \
|
#define MULL MULL
|
||||||
({ int rt, dummy;\
|
static av_always_inline av_const int MULL(int a, int b, unsigned shift)
|
||||||
__asm__ ("imull %3\n\t" : "=d"(rt), "=a"(dummy): "a" ((int)(ra)), "rm" ((int)(rb)));\
|
{
|
||||||
rt; })
|
int rt, dummy;
|
||||||
|
__asm__ (
|
||||||
|
"imull %3 \n\t"
|
||||||
|
"shrdl %4, %%edx, %%eax \n\t"
|
||||||
|
:"=a"(rt), "=d"(dummy)
|
||||||
|
:"a"(a), "rm"(b), "ci"((uint8_t)shift)
|
||||||
|
);
|
||||||
|
return rt;
|
||||||
|
}
|
||||||
|
|
||||||
#define MUL64(ra, rb) \
|
#define MULH MULH
|
||||||
({ int64_t rt;\
|
static av_always_inline av_const int MULH(int a, int b)
|
||||||
__asm__ ("imull %2\n\t" : "=A"(rt) : "a" ((int)(ra)), "g" ((int)(rb)));\
|
{
|
||||||
rt; })
|
int rt, dummy;
|
||||||
#endif
|
__asm__ (
|
||||||
|
"imull %3"
|
||||||
|
:"=d"(rt), "=a"(dummy)
|
||||||
|
:"a"(a), "rm"(b)
|
||||||
|
);
|
||||||
|
return rt;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MUL64 MUL64
|
||||||
|
static av_always_inline av_const int64_t MUL64(int a, int b)
|
||||||
|
{
|
||||||
|
int64_t rt;
|
||||||
|
__asm__ (
|
||||||
|
"imull %2"
|
||||||
|
:"=A"(rt)
|
||||||
|
:"a"(a), "rm"(b)
|
||||||
|
);
|
||||||
|
return rt;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ARCH_X86_32 */
|
||||||
|
|
||||||
#if HAVE_CMOV
|
#if HAVE_CMOV
|
||||||
/* median of 3 */
|
/* median of 3 */
|
||||||
|
@ -25,11 +25,11 @@ unsigned avdevice_version(void)
|
|||||||
|
|
||||||
const char * avdevice_configuration(void)
|
const char * avdevice_configuration(void)
|
||||||
{
|
{
|
||||||
return FFMPEG_CONFIGURATION;
|
return LIBAV_CONFIGURATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char * avdevice_license(void)
|
const char * avdevice_license(void)
|
||||||
{
|
{
|
||||||
#define LICENSE_PREFIX "libavdevice license: "
|
#define LICENSE_PREFIX "libavdevice license: "
|
||||||
return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
|
return LICENSE_PREFIX LIBAV_LICENSE + sizeof(LICENSE_PREFIX) - 1;
|
||||||
}
|
}
|
||||||
|
@ -34,13 +34,13 @@ unsigned avfilter_version(void) {
|
|||||||
|
|
||||||
const char *avfilter_configuration(void)
|
const char *avfilter_configuration(void)
|
||||||
{
|
{
|
||||||
return FFMPEG_CONFIGURATION;
|
return LIBAV_CONFIGURATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *avfilter_license(void)
|
const char *avfilter_license(void)
|
||||||
{
|
{
|
||||||
#define LICENSE_PREFIX "libavfilter license: "
|
#define LICENSE_PREFIX "libavfilter license: "
|
||||||
return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
|
return LICENSE_PREFIX LIBAV_LICENSE + sizeof(LICENSE_PREFIX) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
AVFilterBufferRef *avfilter_ref_buffer(AVFilterBufferRef *ref, int pmask)
|
AVFilterBufferRef *avfilter_ref_buffer(AVFilterBufferRef *ref, int pmask)
|
||||||
|
@ -106,7 +106,7 @@ static int fourxm_read_header(AVFormatContext *s,
|
|||||||
fourxm->fps = 1.0;
|
fourxm->fps = 1.0;
|
||||||
|
|
||||||
/* skip the first 3 32-bit numbers */
|
/* skip the first 3 32-bit numbers */
|
||||||
avio_seek(pb, 12, SEEK_CUR);
|
avio_skip(pb, 12);
|
||||||
|
|
||||||
/* check for LIST-HEAD */
|
/* check for LIST-HEAD */
|
||||||
GET_LIST_HEADER();
|
GET_LIST_HEADER();
|
||||||
@ -322,12 +322,12 @@ static int fourxm_read_packet(AVFormatContext *s,
|
|||||||
fourxm->tracks[track_number].audio_pts += audio_frame_count;
|
fourxm->tracks[track_number].audio_pts += audio_frame_count;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
avio_seek(pb, size, SEEK_CUR);
|
avio_skip(pb, size);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
avio_seek(pb, size, SEEK_CUR);
|
avio_skip(pb, size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -131,9 +131,9 @@ OBJS-$(CONFIG_MMF_MUXER) += mmf.o riff.o
|
|||||||
OBJS-$(CONFIG_MOV_DEMUXER) += mov.o riff.o isom.o
|
OBJS-$(CONFIG_MOV_DEMUXER) += mov.o riff.o isom.o
|
||||||
OBJS-$(CONFIG_MOV_MUXER) += movenc.o riff.o isom.o avc.o \
|
OBJS-$(CONFIG_MOV_MUXER) += movenc.o riff.o isom.o avc.o \
|
||||||
movenchint.o rtpenc_chain.o
|
movenchint.o rtpenc_chain.o
|
||||||
OBJS-$(CONFIG_MP2_MUXER) += mp3enc.o
|
OBJS-$(CONFIG_MP2_MUXER) += mp3enc.o rawenc.o
|
||||||
OBJS-$(CONFIG_MP3_DEMUXER) += mp3dec.o
|
OBJS-$(CONFIG_MP3_DEMUXER) += mp3dec.o
|
||||||
OBJS-$(CONFIG_MP3_MUXER) += mp3enc.o
|
OBJS-$(CONFIG_MP3_MUXER) += mp3enc.o rawenc.o
|
||||||
OBJS-$(CONFIG_MPC_DEMUXER) += mpc.o apetag.o
|
OBJS-$(CONFIG_MPC_DEMUXER) += mpc.o apetag.o
|
||||||
OBJS-$(CONFIG_MPC8_DEMUXER) += mpc8.o
|
OBJS-$(CONFIG_MPC8_DEMUXER) += mpc8.o
|
||||||
OBJS-$(CONFIG_MPEG1SYSTEM_MUXER) += mpegenc.o
|
OBJS-$(CONFIG_MPEG1SYSTEM_MUXER) += mpegenc.o
|
||||||
|
@ -149,7 +149,7 @@ static int a64_write_packet(struct AVFormatContext *s, AVPacket *pkt)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ static int adts_write_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
avio_write(pb, pkt->data, pkt->size);
|
avio_write(pb, pkt->data, pkt->size);
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -62,9 +62,9 @@ static int aea_read_header(AVFormatContext *s,
|
|||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
/* Parse the amount of channels and skip to pos 2048(0x800) */
|
/* Parse the amount of channels and skip to pos 2048(0x800) */
|
||||||
avio_seek(s->pb, 264, SEEK_CUR);
|
avio_skip(s->pb, 264);
|
||||||
st->codec->channels = avio_r8(s->pb);
|
st->codec->channels = avio_r8(s->pb);
|
||||||
avio_seek(s->pb, 1783, SEEK_CUR);
|
avio_skip(s->pb, 1783);
|
||||||
|
|
||||||
|
|
||||||
st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
|
st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
|
||||||
|
@ -70,7 +70,7 @@ static void get_meta(AVFormatContext *s, const char *key, int size)
|
|||||||
int res;
|
int res;
|
||||||
|
|
||||||
if (!str) {
|
if (!str) {
|
||||||
avio_seek(s->pb, size, SEEK_CUR);
|
avio_skip(s->pb, size);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -152,7 +152,7 @@ static unsigned int get_aiff_header(AVIOContext *pb, AVCodecContext *codec,
|
|||||||
|
|
||||||
/* Chunk is over */
|
/* Chunk is over */
|
||||||
if (size)
|
if (size)
|
||||||
avio_seek(pb, size, SEEK_CUR);
|
avio_skip(pb, size);
|
||||||
|
|
||||||
return num_frames;
|
return num_frames;
|
||||||
}
|
}
|
||||||
@ -242,7 +242,7 @@ static int aiff_read_header(AVFormatContext *s,
|
|||||||
av_log(s, AV_LOG_ERROR, "file is not seekable\n");
|
av_log(s, AV_LOG_ERROR, "file is not seekable\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
avio_seek(pb, size - 8, SEEK_CUR);
|
avio_skip(pb, size - 8);
|
||||||
break;
|
break;
|
||||||
case MKTAG('w', 'a', 'v', 'e'):
|
case MKTAG('w', 'a', 'v', 'e'):
|
||||||
if ((uint64_t)size > (1<<30))
|
if ((uint64_t)size > (1<<30))
|
||||||
@ -256,7 +256,7 @@ static int aiff_read_header(AVFormatContext *s,
|
|||||||
default: /* Jump */
|
default: /* Jump */
|
||||||
if (size & 1) /* Always even aligned */
|
if (size & 1) /* Always even aligned */
|
||||||
size++;
|
size++;
|
||||||
avio_seek(pb, size, SEEK_CUR);
|
avio_skip(pb, size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ static int aiff_write_header(AVFormatContext *s)
|
|||||||
av_set_pts_info(s->streams[0], 64, 1, s->streams[0]->codec->sample_rate);
|
av_set_pts_info(s->streams[0], 64, 1, s->streams[0]->codec->sample_rate);
|
||||||
|
|
||||||
/* Data is starting here */
|
/* Data is starting here */
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -140,7 +140,7 @@ static int aiff_write_trailer(AVFormatContext *s)
|
|||||||
/* return to the end */
|
/* return to the end */
|
||||||
avio_seek(pb, end_size, SEEK_SET);
|
avio_seek(pb, end_size, SEEK_SET);
|
||||||
|
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -50,14 +50,14 @@ static int amr_write_header(AVFormatContext *s)
|
|||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int amr_write_packet(AVFormatContext *s, AVPacket *pkt)
|
static int amr_write_packet(AVFormatContext *s, AVPacket *pkt)
|
||||||
{
|
{
|
||||||
avio_write(s->pb, pkt->data, pkt->size);
|
avio_write(s->pb, pkt->data, pkt->size);
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_AMR_MUXER */
|
#endif /* CONFIG_AMR_MUXER */
|
||||||
|
@ -83,7 +83,7 @@ static int read_header(AVFormatContext *s,
|
|||||||
AVStream *st;
|
AVStream *st;
|
||||||
int i, ret;
|
int i, ret;
|
||||||
|
|
||||||
avio_seek(pb, 4, SEEK_CUR); /* magic number */
|
avio_skip(pb, 4); /* magic number */
|
||||||
if (avio_rl16(pb) != MAX_PAGES) {
|
if (avio_rl16(pb) != MAX_PAGES) {
|
||||||
av_log_ask_for_sample(s, "max_pages != " AV_STRINGIFY(MAX_PAGES) "\n");
|
av_log_ask_for_sample(s, "max_pages != " AV_STRINGIFY(MAX_PAGES) "\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
@ -91,7 +91,7 @@ static int read_header(AVFormatContext *s,
|
|||||||
|
|
||||||
anm->nb_pages = avio_rl16(pb);
|
anm->nb_pages = avio_rl16(pb);
|
||||||
anm->nb_records = avio_rl32(pb);
|
anm->nb_records = avio_rl32(pb);
|
||||||
avio_seek(pb, 2, SEEK_CUR); /* max records per page */
|
avio_skip(pb, 2); /* max records per page */
|
||||||
anm->page_table_offset = avio_rl16(pb);
|
anm->page_table_offset = avio_rl16(pb);
|
||||||
if (avio_rl32(pb) != ANIM_TAG)
|
if (avio_rl32(pb) != ANIM_TAG)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
@ -107,13 +107,13 @@ static int read_header(AVFormatContext *s,
|
|||||||
st->codec->height = avio_rl16(pb);
|
st->codec->height = avio_rl16(pb);
|
||||||
if (avio_r8(pb) != 0)
|
if (avio_r8(pb) != 0)
|
||||||
goto invalid;
|
goto invalid;
|
||||||
avio_seek(pb, 1, SEEK_CUR); /* frame rate multiplier info */
|
avio_skip(pb, 1); /* frame rate multiplier info */
|
||||||
|
|
||||||
/* ignore last delta record (used for looping) */
|
/* ignore last delta record (used for looping) */
|
||||||
if (avio_r8(pb)) /* has_last_delta */
|
if (avio_r8(pb)) /* has_last_delta */
|
||||||
anm->nb_records = FFMAX(anm->nb_records - 1, 0);
|
anm->nb_records = FFMAX(anm->nb_records - 1, 0);
|
||||||
|
|
||||||
avio_seek(pb, 1, SEEK_CUR); /* last_delta_valid */
|
avio_skip(pb, 1); /* last_delta_valid */
|
||||||
|
|
||||||
if (avio_r8(pb) != 0)
|
if (avio_r8(pb) != 0)
|
||||||
goto invalid;
|
goto invalid;
|
||||||
@ -121,15 +121,15 @@ static int read_header(AVFormatContext *s,
|
|||||||
if (avio_r8(pb) != 1)
|
if (avio_r8(pb) != 1)
|
||||||
goto invalid;
|
goto invalid;
|
||||||
|
|
||||||
avio_seek(pb, 1, SEEK_CUR); /* other recs per frame */
|
avio_skip(pb, 1); /* other recs per frame */
|
||||||
|
|
||||||
if (avio_r8(pb) != 1)
|
if (avio_r8(pb) != 1)
|
||||||
goto invalid;
|
goto invalid;
|
||||||
|
|
||||||
avio_seek(pb, 32, SEEK_CUR); /* record_types */
|
avio_skip(pb, 32); /* record_types */
|
||||||
st->nb_frames = avio_rl32(pb);
|
st->nb_frames = avio_rl32(pb);
|
||||||
av_set_pts_info(st, 64, 1, avio_rl16(pb));
|
av_set_pts_info(st, 64, 1, avio_rl16(pb));
|
||||||
avio_seek(pb, 58, SEEK_CUR);
|
avio_skip(pb, 58);
|
||||||
|
|
||||||
/* color cycling and palette data */
|
/* color cycling and palette data */
|
||||||
st->codec->extradata_size = 16*8 + 4*256;
|
st->codec->extradata_size = 16*8 + 4*256;
|
||||||
@ -193,7 +193,7 @@ repeat:
|
|||||||
/* parse page header */
|
/* parse page header */
|
||||||
if (anm->record < 0) {
|
if (anm->record < 0) {
|
||||||
avio_seek(pb, anm->page_table_offset + MAX_PAGES*6 + (anm->page<<16), SEEK_SET);
|
avio_seek(pb, anm->page_table_offset + MAX_PAGES*6 + (anm->page<<16), SEEK_SET);
|
||||||
avio_seek(pb, 8 + 2*p->nb_records, SEEK_CUR);
|
avio_skip(pb, 8 + 2*p->nb_records);
|
||||||
anm->record = 0;
|
anm->record = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,7 +187,7 @@ static int ape_read_header(AVFormatContext * s, AVFormatParameters * ap)
|
|||||||
/* Skip any unknown bytes at the end of the descriptor.
|
/* Skip any unknown bytes at the end of the descriptor.
|
||||||
This is for future compatibility */
|
This is for future compatibility */
|
||||||
if (ape->descriptorlength > 52)
|
if (ape->descriptorlength > 52)
|
||||||
avio_seek(pb, ape->descriptorlength - 52, SEEK_CUR);
|
avio_skip(pb, ape->descriptorlength - 52);
|
||||||
|
|
||||||
/* Read header data */
|
/* Read header data */
|
||||||
ape->compressiontype = avio_rl16(pb);
|
ape->compressiontype = avio_rl16(pb);
|
||||||
@ -212,7 +212,7 @@ static int ape_read_header(AVFormatContext * s, AVFormatParameters * ap)
|
|||||||
ape->finalframeblocks = avio_rl32(pb);
|
ape->finalframeblocks = avio_rl32(pb);
|
||||||
|
|
||||||
if (ape->formatflags & MAC_FORMAT_FLAG_HAS_PEAK_LEVEL) {
|
if (ape->formatflags & MAC_FORMAT_FLAG_HAS_PEAK_LEVEL) {
|
||||||
avio_seek(pb, 4, SEEK_CUR); /* Skip the peak level */
|
avio_skip(pb, 4); /* Skip the peak level */
|
||||||
ape->headerlength += 4;
|
ape->headerlength += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,7 +239,7 @@ static int ape_read_header(AVFormatContext * s, AVFormatParameters * ap)
|
|||||||
|
|
||||||
/* Skip any stored wav header */
|
/* Skip any stored wav header */
|
||||||
if (!(ape->formatflags & MAC_FORMAT_FLAG_CREATE_WAV_HEADER))
|
if (!(ape->formatflags & MAC_FORMAT_FLAG_CREATE_WAV_HEADER))
|
||||||
avio_seek(pb, ape->wavheaderlength, SEEK_CUR);
|
avio_skip(pb, ape->wavheaderlength);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!ape->totalframes){
|
if(!ape->totalframes){
|
||||||
|
@ -86,57 +86,6 @@ static int read_chomp_line(AVIOContext *s, char *buf, int maxlen)
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void make_absolute_url(char *buf, int size, const char *base,
|
|
||||||
const char *rel)
|
|
||||||
{
|
|
||||||
char *sep;
|
|
||||||
/* Absolute path, relative to the current server */
|
|
||||||
if (base && strstr(base, "://") && rel[0] == '/') {
|
|
||||||
if (base != buf)
|
|
||||||
av_strlcpy(buf, base, size);
|
|
||||||
sep = strstr(buf, "://");
|
|
||||||
if (sep) {
|
|
||||||
sep += 3;
|
|
||||||
sep = strchr(sep, '/');
|
|
||||||
if (sep)
|
|
||||||
*sep = '\0';
|
|
||||||
}
|
|
||||||
av_strlcat(buf, rel, size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/* If rel actually is an absolute url, just copy it */
|
|
||||||
if (!base || strstr(rel, "://") || rel[0] == '/') {
|
|
||||||
av_strlcpy(buf, rel, size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (base != buf)
|
|
||||||
av_strlcpy(buf, base, size);
|
|
||||||
/* Remove the file name from the base url */
|
|
||||||
sep = strrchr(buf, '/');
|
|
||||||
if (sep)
|
|
||||||
sep[1] = '\0';
|
|
||||||
else
|
|
||||||
buf[0] = '\0';
|
|
||||||
while (av_strstart(rel, "../", NULL) && sep) {
|
|
||||||
/* Remove the path delimiter at the end */
|
|
||||||
sep[0] = '\0';
|
|
||||||
sep = strrchr(buf, '/');
|
|
||||||
/* If the next directory name to pop off is "..", break here */
|
|
||||||
if (!strcmp(sep ? &sep[1] : buf, "..")) {
|
|
||||||
/* Readd the slash we just removed */
|
|
||||||
av_strlcat(buf, "/", size);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Cut off the directory name */
|
|
||||||
if (sep)
|
|
||||||
sep[1] = '\0';
|
|
||||||
else
|
|
||||||
buf[0] = '\0';
|
|
||||||
rel += 3;
|
|
||||||
}
|
|
||||||
av_strlcat(buf, rel, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void free_segment_list(struct variant *var)
|
static void free_segment_list(struct variant *var)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -183,7 +132,7 @@ static struct variant *new_variant(AppleHTTPContext *c, int bandwidth,
|
|||||||
return NULL;
|
return NULL;
|
||||||
reset_packet(&var->pkt);
|
reset_packet(&var->pkt);
|
||||||
var->bandwidth = bandwidth;
|
var->bandwidth = bandwidth;
|
||||||
make_absolute_url(var->url, sizeof(var->url), base, url);
|
ff_make_absolute_url(var->url, sizeof(var->url), base, url);
|
||||||
dynarray_add(&c->variants, &c->n_variants, var);
|
dynarray_add(&c->variants, &c->n_variants, var);
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
@ -274,7 +223,7 @@ static int parse_playlist(AppleHTTPContext *c, const char *url,
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
seg->duration = duration;
|
seg->duration = duration;
|
||||||
make_absolute_url(seg->url, sizeof(seg->url), url, line);
|
ff_make_absolute_url(seg->url, sizeof(seg->url), url, line);
|
||||||
dynarray_add(&var->segments, &var->n_segments, seg);
|
dynarray_add(&var->segments, &var->n_segments, seg);
|
||||||
is_segment = 0;
|
is_segment = 0;
|
||||||
}
|
}
|
||||||
@ -519,7 +468,7 @@ reload:
|
|||||||
c->max_start_seq - c->cur_seq_no);
|
c->max_start_seq - c->cur_seq_no);
|
||||||
c->cur_seq_no = c->max_start_seq;
|
c->cur_seq_no = c->max_start_seq;
|
||||||
}
|
}
|
||||||
/* If more segments exit, open the next one */
|
/* If more segments exist, open the next one */
|
||||||
if (c->cur_seq_no < c->min_end_seq)
|
if (c->cur_seq_no < c->min_end_seq)
|
||||||
goto start;
|
goto start;
|
||||||
/* We've reached the end of the playlists - return eof if this is a
|
/* We've reached the end of the playlists - return eof if this is a
|
||||||
|
@ -75,57 +75,6 @@ static int read_chomp_line(AVIOContext *s, char *buf, int maxlen)
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void make_absolute_url(char *buf, int size, const char *base,
|
|
||||||
const char *rel)
|
|
||||||
{
|
|
||||||
char *sep;
|
|
||||||
/* Absolute path, relative to the current server */
|
|
||||||
if (base && strstr(base, "://") && rel[0] == '/') {
|
|
||||||
if (base != buf)
|
|
||||||
av_strlcpy(buf, base, size);
|
|
||||||
sep = strstr(buf, "://");
|
|
||||||
if (sep) {
|
|
||||||
sep += 3;
|
|
||||||
sep = strchr(sep, '/');
|
|
||||||
if (sep)
|
|
||||||
*sep = '\0';
|
|
||||||
}
|
|
||||||
av_strlcat(buf, rel, size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/* If rel actually is an absolute url, just copy it */
|
|
||||||
if (!base || strstr(rel, "://") || rel[0] == '/') {
|
|
||||||
av_strlcpy(buf, rel, size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (base != buf)
|
|
||||||
av_strlcpy(buf, base, size);
|
|
||||||
/* Remove the file name from the base url */
|
|
||||||
sep = strrchr(buf, '/');
|
|
||||||
if (sep)
|
|
||||||
sep[1] = '\0';
|
|
||||||
else
|
|
||||||
buf[0] = '\0';
|
|
||||||
while (av_strstart(rel, "../", NULL) && sep) {
|
|
||||||
/* Remove the path delimiter at the end */
|
|
||||||
sep[0] = '\0';
|
|
||||||
sep = strrchr(buf, '/');
|
|
||||||
/* If the next directory name to pop off is "..", break here */
|
|
||||||
if (!strcmp(sep ? &sep[1] : buf, "..")) {
|
|
||||||
/* Readd the slash we just removed */
|
|
||||||
av_strlcat(buf, "/", size);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Cut off the directory name */
|
|
||||||
if (sep)
|
|
||||||
sep[1] = '\0';
|
|
||||||
else
|
|
||||||
buf[0] = '\0';
|
|
||||||
rel += 3;
|
|
||||||
}
|
|
||||||
av_strlcat(buf, rel, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void free_segment_list(AppleHTTPContext *s)
|
static void free_segment_list(AppleHTTPContext *s)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -201,7 +150,7 @@ static int parse_playlist(URLContext *h, const char *url)
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
seg->duration = duration;
|
seg->duration = duration;
|
||||||
make_absolute_url(seg->url, sizeof(seg->url), url, line);
|
ff_make_absolute_url(seg->url, sizeof(seg->url), url, line);
|
||||||
dynarray_add(&s->segments, &s->n_segments, seg);
|
dynarray_add(&s->segments, &s->n_segments, seg);
|
||||||
is_segment = 0;
|
is_segment = 0;
|
||||||
} else if (is_variant) {
|
} else if (is_variant) {
|
||||||
@ -211,7 +160,7 @@ static int parse_playlist(URLContext *h, const char *url)
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
var->bandwidth = bandwidth;
|
var->bandwidth = bandwidth;
|
||||||
make_absolute_url(var->url, sizeof(var->url), url, line);
|
ff_make_absolute_url(var->url, sizeof(var->url), url, line);
|
||||||
dynarray_add(&s->variants, &s->n_variants, var);
|
dynarray_add(&s->variants, &s->n_variants, var);
|
||||||
is_variant = 0;
|
is_variant = 0;
|
||||||
}
|
}
|
||||||
|
@ -349,7 +349,7 @@ static int asf_read_stream_properties(AVFormatContext *s, int64_t size)
|
|||||||
avio_rl16(pb); /* panes */
|
avio_rl16(pb); /* panes */
|
||||||
st->codec->bits_per_coded_sample = avio_rl16(pb); /* depth */
|
st->codec->bits_per_coded_sample = avio_rl16(pb); /* depth */
|
||||||
tag1 = avio_rl32(pb);
|
tag1 = avio_rl32(pb);
|
||||||
avio_seek(pb, 20, SEEK_CUR);
|
avio_skip(pb, 20);
|
||||||
// av_log(s, AV_LOG_DEBUG, "size:%d tsize:%d sizeX:%d\n", size, total_size, sizeX);
|
// av_log(s, AV_LOG_DEBUG, "size:%d tsize:%d sizeX:%d\n", size, total_size, sizeX);
|
||||||
if (sizeX > 40) {
|
if (sizeX > 40) {
|
||||||
st->codec->extradata_size = sizeX - 40;
|
st->codec->extradata_size = sizeX - 40;
|
||||||
@ -387,7 +387,7 @@ static int asf_read_stream_properties(AVFormatContext *s, int64_t size)
|
|||||||
st->need_parsing = AVSTREAM_PARSE_FULL_ONCE;
|
st->need_parsing = AVSTREAM_PARSE_FULL_ONCE;
|
||||||
}
|
}
|
||||||
pos2 = avio_tell(pb);
|
pos2 = avio_tell(pb);
|
||||||
avio_seek(pb, size - (pos2 - pos1 + 24), SEEK_CUR);
|
avio_skip(pb, size - (pos2 - pos1 + 24));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -427,14 +427,14 @@ static int asf_read_ext_stream_properties(AVFormatContext *s, int64_t size)
|
|||||||
for (i=0; i<stream_ct; i++){
|
for (i=0; i<stream_ct; i++){
|
||||||
avio_rl16(pb);
|
avio_rl16(pb);
|
||||||
ext_len = avio_rl16(pb);
|
ext_len = avio_rl16(pb);
|
||||||
avio_seek(pb, ext_len, SEEK_CUR);
|
avio_skip(pb, ext_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i<payload_ext_ct; i++){
|
for (i=0; i<payload_ext_ct; i++){
|
||||||
ff_get_guid(pb, &g);
|
ff_get_guid(pb, &g);
|
||||||
ext_d=avio_rl16(pb);
|
ext_d=avio_rl16(pb);
|
||||||
ext_len=avio_rl32(pb);
|
ext_len=avio_rl32(pb);
|
||||||
avio_seek(pb, ext_len, SEEK_CUR);
|
avio_skip(pb, ext_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -454,7 +454,7 @@ static int asf_read_content_desc(AVFormatContext *s, int64_t size)
|
|||||||
get_tag(s, "author" , 0, len2);
|
get_tag(s, "author" , 0, len2);
|
||||||
get_tag(s, "copyright", 0, len3);
|
get_tag(s, "copyright", 0, len3);
|
||||||
get_tag(s, "comment" , 0, len4);
|
get_tag(s, "comment" , 0, len4);
|
||||||
avio_seek(pb, len5, SEEK_CUR);
|
avio_skip(pb, len5);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -474,7 +474,7 @@ static int asf_read_ext_content_desc(AVFormatContext *s, int64_t size)
|
|||||||
if (name_len%2) // must be even, broken lavf versions wrote len-1
|
if (name_len%2) // must be even, broken lavf versions wrote len-1
|
||||||
name_len += 1;
|
name_len += 1;
|
||||||
if ((ret = avio_get_str16le(pb, name_len, name, sizeof(name))) < name_len)
|
if ((ret = avio_get_str16le(pb, name_len, name, sizeof(name))) < name_len)
|
||||||
avio_seek(pb, name_len - ret, SEEK_CUR);
|
avio_skip(pb, name_len - ret);
|
||||||
value_type = avio_rl16(pb);
|
value_type = avio_rl16(pb);
|
||||||
value_len = avio_rl16(pb);
|
value_len = avio_rl16(pb);
|
||||||
if (!value_type && value_len%2)
|
if (!value_type && value_len%2)
|
||||||
@ -504,7 +504,7 @@ static int asf_read_language_list(AVFormatContext *s, int64_t size)
|
|||||||
char lang[6];
|
char lang[6];
|
||||||
unsigned int lang_len = avio_r8(pb);
|
unsigned int lang_len = avio_r8(pb);
|
||||||
if ((ret = avio_get_str16le(pb, lang_len, lang, sizeof(lang))) < lang_len)
|
if ((ret = avio_get_str16le(pb, lang_len, lang, sizeof(lang))) < lang_len)
|
||||||
avio_seek(pb, lang_len - ret, SEEK_CUR);
|
avio_skip(pb, lang_len - ret);
|
||||||
if (j < 128)
|
if (j < 128)
|
||||||
av_strlcpy(asf->stream_languages[j], lang, sizeof(*asf->stream_languages));
|
av_strlcpy(asf->stream_languages[j], lang, sizeof(*asf->stream_languages));
|
||||||
}
|
}
|
||||||
@ -530,10 +530,10 @@ static int asf_read_metadata(AVFormatContext *s, int64_t size)
|
|||||||
value_len= avio_rl32(pb);
|
value_len= avio_rl32(pb);
|
||||||
|
|
||||||
if ((ret = avio_get_str16le(pb, name_len, name, sizeof(name))) < name_len)
|
if ((ret = avio_get_str16le(pb, name_len, name, sizeof(name))) < name_len)
|
||||||
avio_seek(pb, name_len - ret, SEEK_CUR);
|
avio_skip(pb, name_len - ret);
|
||||||
//av_log(s, AV_LOG_ERROR, "%d %d %d %d %d <%s>\n", i, stream_num, name_len, value_type, value_len, name);
|
//av_log(s, AV_LOG_ERROR, "%d %d %d %d %d <%s>\n", i, stream_num, name_len, value_type, value_len, name);
|
||||||
value_num= avio_rl16(pb);//we should use get_value() here but it does not work 2 is le16 here but le32 elsewhere
|
value_num= avio_rl16(pb);//we should use get_value() here but it does not work 2 is le16 here but le32 elsewhere
|
||||||
avio_seek(pb, value_len - 2, SEEK_CUR);
|
avio_skip(pb, value_len - 2);
|
||||||
|
|
||||||
if(stream_num<128){
|
if(stream_num<128){
|
||||||
if (!strcmp(name, "AspectRatioX")) asf->dar[stream_num].num= value_num;
|
if (!strcmp(name, "AspectRatioX")) asf->dar[stream_num].num= value_num;
|
||||||
@ -570,7 +570,7 @@ static int asf_read_marker(AVFormatContext *s, int64_t size)
|
|||||||
avio_rl32(pb); // flags
|
avio_rl32(pb); // flags
|
||||||
name_len = avio_rl32(pb); // name length
|
name_len = avio_rl32(pb); // name length
|
||||||
if ((ret = avio_get_str16le(pb, name_len * 2, name, sizeof(name))) < name_len)
|
if ((ret = avio_get_str16le(pb, name_len * 2, name, sizeof(name))) < name_len)
|
||||||
avio_seek(pb, name_len - ret, SEEK_CUR);
|
avio_skip(pb, name_len - ret);
|
||||||
ff_new_chapter(s, i, (AVRational){1, 10000000}, pres_time, AV_NOPTS_VALUE, name );
|
ff_new_chapter(s, i, (AVRational){1, 10000000}, pres_time, AV_NOPTS_VALUE, name );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -825,16 +825,16 @@ static int asf_read_frame_header(AVFormatContext *s, AVIOContext *pb){
|
|||||||
// for(i=0; i<asf->packet_replic_size-8; i++)
|
// for(i=0; i<asf->packet_replic_size-8; i++)
|
||||||
// av_log(s, AV_LOG_DEBUG, "%02X ",avio_r8(pb));
|
// av_log(s, AV_LOG_DEBUG, "%02X ",avio_r8(pb));
|
||||||
// av_log(s, AV_LOG_DEBUG, "\n");
|
// av_log(s, AV_LOG_DEBUG, "\n");
|
||||||
avio_seek(pb, 10, SEEK_CUR);
|
avio_skip(pb, 10);
|
||||||
ts0= avio_rl64(pb);
|
ts0= avio_rl64(pb);
|
||||||
ts1= avio_rl64(pb);
|
ts1= avio_rl64(pb);
|
||||||
avio_seek(pb, 12, SEEK_CUR);
|
avio_skip(pb, 12);
|
||||||
avio_rl32(pb);
|
avio_rl32(pb);
|
||||||
avio_seek(pb, asf->packet_replic_size - 8 - 38 - 4, SEEK_CUR);
|
avio_skip(pb, asf->packet_replic_size - 8 - 38 - 4);
|
||||||
if(ts0!= -1) asf->packet_frag_timestamp= ts0/10000;
|
if(ts0!= -1) asf->packet_frag_timestamp= ts0/10000;
|
||||||
else asf->packet_frag_timestamp= AV_NOPTS_VALUE;
|
else asf->packet_frag_timestamp= AV_NOPTS_VALUE;
|
||||||
}else
|
}else
|
||||||
avio_seek(pb, asf->packet_replic_size - 8, SEEK_CUR);
|
avio_skip(pb, asf->packet_replic_size - 8);
|
||||||
rsize += asf->packet_replic_size; // FIXME - check validity
|
rsize += asf->packet_replic_size; // FIXME - check validity
|
||||||
} else if (asf->packet_replic_size==1){
|
} else if (asf->packet_replic_size==1){
|
||||||
// multipacket - frag_offset is beginning timestamp
|
// multipacket - frag_offset is beginning timestamp
|
||||||
@ -894,7 +894,7 @@ static int ff_asf_parse_packet(AVFormatContext *s, AVIOContext *pb, AVPacket *pk
|
|||||||
//printf("PacketLeftSize:%d Pad:%d Pos:%"PRId64"\n", asf->packet_size_left, asf->packet_padsize, avio_tell(pb));
|
//printf("PacketLeftSize:%d Pad:%d Pos:%"PRId64"\n", asf->packet_size_left, asf->packet_padsize, avio_tell(pb));
|
||||||
assert(ret>=0);
|
assert(ret>=0);
|
||||||
/* fail safe */
|
/* fail safe */
|
||||||
avio_seek(pb, ret, SEEK_CUR);
|
avio_skip(pb, ret);
|
||||||
|
|
||||||
asf->packet_pos= avio_tell(pb);
|
asf->packet_pos= avio_tell(pb);
|
||||||
if (asf->data_object_size != (uint64_t)-1 &&
|
if (asf->data_object_size != (uint64_t)-1 &&
|
||||||
@ -913,7 +913,7 @@ static int ff_asf_parse_packet(AVFormatContext *s, AVIOContext *pb, AVPacket *pk
|
|||||||
) {
|
) {
|
||||||
asf->packet_time_start = 0;
|
asf->packet_time_start = 0;
|
||||||
/* unhandled packet (should not happen) */
|
/* unhandled packet (should not happen) */
|
||||||
avio_seek(pb, asf->packet_frag_size, SEEK_CUR);
|
avio_skip(pb, asf->packet_frag_size);
|
||||||
asf->packet_size_left -= asf->packet_frag_size;
|
asf->packet_size_left -= asf->packet_frag_size;
|
||||||
if(asf->stream_index < 0)
|
if(asf->stream_index < 0)
|
||||||
av_log(s, AV_LOG_ERROR, "ff asf skip %d (unknown stream)\n", asf->packet_frag_size);
|
av_log(s, AV_LOG_ERROR, "ff asf skip %d (unknown stream)\n", asf->packet_frag_size);
|
||||||
@ -933,7 +933,7 @@ static int ff_asf_parse_packet(AVFormatContext *s, AVIOContext *pb, AVPacket *pk
|
|||||||
if (asf->packet_multi_size < asf->packet_obj_size)
|
if (asf->packet_multi_size < asf->packet_obj_size)
|
||||||
{
|
{
|
||||||
asf->packet_time_start = 0;
|
asf->packet_time_start = 0;
|
||||||
avio_seek(pb, asf->packet_multi_size, SEEK_CUR);
|
avio_skip(pb, asf->packet_multi_size);
|
||||||
asf->packet_size_left -= asf->packet_multi_size;
|
asf->packet_size_left -= asf->packet_multi_size;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1198,7 +1198,7 @@ static void asf_build_simple_index(AVFormatContext *s, int stream_index)
|
|||||||
avio_seek(s->pb, current_pos, SEEK_SET);
|
avio_seek(s->pb, current_pos, SEEK_SET);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
avio_seek(s->pb, gsize-24, SEEK_CUR);
|
avio_skip(s->pb, gsize-24);
|
||||||
ff_get_guid(s->pb, &g);
|
ff_get_guid(s->pb, &g);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -574,7 +574,7 @@ static int asf_write_header(AVFormatContext *s)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
|
|
||||||
asf->packet_nb_payloads = 0;
|
asf->packet_nb_payloads = 0;
|
||||||
asf->packet_timestamp_start = -1;
|
asf->packet_timestamp_start = -1;
|
||||||
@ -672,7 +672,7 @@ static void flush_packet(AVFormatContext *s)
|
|||||||
|
|
||||||
avio_write(s->pb, asf->packet_buf, s->packet_size - packet_hdr_size);
|
avio_write(s->pb, asf->packet_buf, s->packet_size - packet_hdr_size);
|
||||||
|
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
asf->nb_packets++;
|
asf->nb_packets++;
|
||||||
asf->packet_nb_payloads = 0;
|
asf->packet_nb_payloads = 0;
|
||||||
asf->packet_timestamp_start = -1;
|
asf->packet_timestamp_start = -1;
|
||||||
@ -864,7 +864,7 @@ static int asf_write_trailer(AVFormatContext *s)
|
|||||||
if ((!asf->is_streamed) && (asf->nb_index_count != 0)) {
|
if ((!asf->is_streamed) && (asf->nb_index_count != 0)) {
|
||||||
asf_write_index(s, asf->index_ptr, asf->maximum_packet, asf->nb_index_count);
|
asf_write_index(s, asf->index_ptr, asf->maximum_packet, asf->nb_index_count);
|
||||||
}
|
}
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
|
|
||||||
if (asf->is_streamed || url_is_streamed(s->pb)) {
|
if (asf->is_streamed || url_is_streamed(s->pb)) {
|
||||||
put_chunk(s, 0x4524, 0, 0); /* end of stream */
|
put_chunk(s, 0x4524, 0, 0); /* end of stream */
|
||||||
@ -875,7 +875,7 @@ static int asf_write_trailer(AVFormatContext *s)
|
|||||||
asf_write_header1(s, file_size, data_size - asf->data_offset);
|
asf_write_header1(s, file_size, data_size - asf->data_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
av_free(asf->index_ptr);
|
av_free(asf->index_ptr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,7 @@ static int write_header(AVFormatContext *s)
|
|||||||
last=p;
|
last=p;
|
||||||
}
|
}
|
||||||
|
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -59,7 +59,7 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
{
|
{
|
||||||
avio_write(s->pb, pkt->data, pkt->size);
|
avio_write(s->pb, pkt->data, pkt->size);
|
||||||
|
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -72,7 +72,7 @@ static int write_trailer(AVFormatContext *s)
|
|||||||
avio_write(s->pb, avctx->extradata + ass->extra_index,
|
avio_write(s->pb, avctx->extradata + ass->extra_index,
|
||||||
avctx->extradata_size - ass->extra_index);
|
avctx->extradata_size - ass->extra_index);
|
||||||
|
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ static int au_write_header(AVFormatContext *s)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -99,7 +99,7 @@ static int au_write_trailer(AVFormatContext *s)
|
|||||||
avio_wb32(pb, (uint32_t)(file_size - 24));
|
avio_wb32(pb, (uint32_t)(file_size - 24));
|
||||||
avio_seek(pb, file_size, SEEK_SET);
|
avio_seek(pb, file_size, SEEK_SET);
|
||||||
|
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -147,7 +147,7 @@ static int au_read_header(AVFormatContext *s,
|
|||||||
|
|
||||||
if (size >= 24) {
|
if (size >= 24) {
|
||||||
/* skip unused data */
|
/* skip unused data */
|
||||||
avio_seek(pb, size - 24, SEEK_CUR);
|
avio_skip(pb, size - 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now we are ready: build format streams */
|
/* now we are ready: build format streams */
|
||||||
|
@ -321,12 +321,12 @@ static void avi_read_nikon(AVFormatContext *s, uint64_t end)
|
|||||||
}
|
}
|
||||||
if (name)
|
if (name)
|
||||||
av_metadata_set2(&s->metadata, name, buffer, 0);
|
av_metadata_set2(&s->metadata, name, buffer, 0);
|
||||||
avio_seek(s->pb, size, SEEK_CUR);
|
avio_skip(s->pb, size);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
avio_seek(s->pb, size, SEEK_CUR);
|
avio_skip(s->pb, size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -392,13 +392,13 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
unsigned char date[64] = {0};
|
unsigned char date[64] = {0};
|
||||||
size += (size & 1);
|
size += (size & 1);
|
||||||
size -= avio_read(pb, date, FFMIN(size, sizeof(date)-1));
|
size -= avio_read(pb, date, FFMIN(size, sizeof(date)-1));
|
||||||
avio_seek(pb, size, SEEK_CUR);
|
avio_skip(pb, size);
|
||||||
avi_metadata_creation_time(&s->metadata, date);
|
avi_metadata_creation_time(&s->metadata, date);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MKTAG('d', 'm', 'l', 'h'):
|
case MKTAG('d', 'm', 'l', 'h'):
|
||||||
avi->is_odml = 1;
|
avi->is_odml = 1;
|
||||||
avio_seek(pb, size + (size & 1), SEEK_CUR);
|
avio_skip(pb, size + (size & 1));
|
||||||
break;
|
break;
|
||||||
case MKTAG('a', 'm', 'v', 'h'):
|
case MKTAG('a', 'm', 'v', 'h'):
|
||||||
amv_file_format=1;
|
amv_file_format=1;
|
||||||
@ -410,13 +410,13 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
avio_rl32(pb);
|
avio_rl32(pb);
|
||||||
avi->non_interleaved |= avio_rl32(pb) & AVIF_MUSTUSEINDEX;
|
avi->non_interleaved |= avio_rl32(pb) & AVIF_MUSTUSEINDEX;
|
||||||
|
|
||||||
avio_seek(pb, 2 * 4, SEEK_CUR);
|
avio_skip(pb, 2 * 4);
|
||||||
avio_rl32(pb);
|
avio_rl32(pb);
|
||||||
avio_rl32(pb);
|
avio_rl32(pb);
|
||||||
avih_width=avio_rl32(pb);
|
avih_width=avio_rl32(pb);
|
||||||
avih_height=avio_rl32(pb);
|
avih_height=avio_rl32(pb);
|
||||||
|
|
||||||
avio_seek(pb, size - 10 * 4, SEEK_CUR);
|
avio_skip(pb, size - 10 * 4);
|
||||||
break;
|
break;
|
||||||
case MKTAG('s', 't', 'r', 'h'):
|
case MKTAG('s', 't', 'r', 'h'):
|
||||||
/* stream header */
|
/* stream header */
|
||||||
@ -425,7 +425,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
handler = avio_rl32(pb); /* codec tag */
|
handler = avio_rl32(pb); /* codec tag */
|
||||||
|
|
||||||
if(tag1 == MKTAG('p', 'a', 'd', 's')){
|
if(tag1 == MKTAG('p', 'a', 'd', 's')){
|
||||||
avio_seek(pb, size - 8, SEEK_CUR);
|
avio_skip(pb, size - 8);
|
||||||
break;
|
break;
|
||||||
}else{
|
}else{
|
||||||
stream_index++;
|
stream_index++;
|
||||||
@ -469,10 +469,10 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
s->streams[0]->priv_data = ast;
|
s->streams[0]->priv_data = ast;
|
||||||
avio_seek(pb, 3 * 4, SEEK_CUR);
|
avio_skip(pb, 3 * 4);
|
||||||
ast->scale = avio_rl32(pb);
|
ast->scale = avio_rl32(pb);
|
||||||
ast->rate = avio_rl32(pb);
|
ast->rate = avio_rl32(pb);
|
||||||
avio_seek(pb, 4, SEEK_CUR); /* start time */
|
avio_skip(pb, 4); /* start time */
|
||||||
|
|
||||||
dv_dur = avio_rl32(pb);
|
dv_dur = avio_rl32(pb);
|
||||||
if (ast->scale > 0 && ast->rate > 0 && dv_dur > 0) {
|
if (ast->scale > 0 && ast->rate > 0 && dv_dur > 0) {
|
||||||
@ -485,7 +485,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
stream_index = s->nb_streams - 1;
|
stream_index = s->nb_streams - 1;
|
||||||
avio_seek(pb, size - 9*4, SEEK_CUR);
|
avio_skip(pb, size - 9*4);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -542,12 +542,12 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
if(ast->sample_size == 0)
|
if(ast->sample_size == 0)
|
||||||
st->duration = st->nb_frames;
|
st->duration = st->nb_frames;
|
||||||
ast->frame_offset= ast->cum_len;
|
ast->frame_offset= ast->cum_len;
|
||||||
avio_seek(pb, size - 12 * 4, SEEK_CUR);
|
avio_skip(pb, size - 12 * 4);
|
||||||
break;
|
break;
|
||||||
case MKTAG('s', 't', 'r', 'f'):
|
case MKTAG('s', 't', 'r', 'f'):
|
||||||
/* stream header */
|
/* stream header */
|
||||||
if (stream_index >= (unsigned)s->nb_streams || avi->dv_demux) {
|
if (stream_index >= (unsigned)s->nb_streams || avi->dv_demux) {
|
||||||
avio_seek(pb, size, SEEK_CUR);
|
avio_skip(pb, size);
|
||||||
} else {
|
} else {
|
||||||
uint64_t cur_pos = avio_tell(pb);
|
uint64_t cur_pos = avio_tell(pb);
|
||||||
if (cur_pos < list_end)
|
if (cur_pos < list_end)
|
||||||
@ -560,7 +560,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
st->codec->height=avih_height;
|
st->codec->height=avih_height;
|
||||||
st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
|
st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
|
||||||
st->codec->codec_id = CODEC_ID_AMV;
|
st->codec->codec_id = CODEC_ID_AMV;
|
||||||
avio_seek(pb, size, SEEK_CUR);
|
avio_skip(pb, size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tag1 = ff_get_bmp_header(pb, st);
|
tag1 = ff_get_bmp_header(pb, st);
|
||||||
@ -620,7 +620,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
}
|
}
|
||||||
st->codec->height= FFABS(st->codec->height);
|
st->codec->height= FFABS(st->codec->height);
|
||||||
|
|
||||||
// avio_seek(pb, size - 5 * 4, SEEK_CUR);
|
// avio_skip(pb, size - 5 * 4);
|
||||||
break;
|
break;
|
||||||
case AVMEDIA_TYPE_AUDIO:
|
case AVMEDIA_TYPE_AUDIO:
|
||||||
ff_get_wav_header(pb, st->codec, size);
|
ff_get_wav_header(pb, st->codec, size);
|
||||||
@ -630,7 +630,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
ast->sample_size= st->codec->block_align;
|
ast->sample_size= st->codec->block_align;
|
||||||
}
|
}
|
||||||
if (size&1) /* 2-aligned (fix for Stargate SG-1 - 3x18 - Shades of Grey.avi) */
|
if (size&1) /* 2-aligned (fix for Stargate SG-1 - 3x18 - Shades of Grey.avi) */
|
||||||
avio_seek(pb, 1, SEEK_CUR);
|
avio_skip(pb, 1);
|
||||||
/* Force parsing as several audio frames can be in
|
/* Force parsing as several audio frames can be in
|
||||||
* one packet and timestamps refer to packet start. */
|
* one packet and timestamps refer to packet start. */
|
||||||
st->need_parsing = AVSTREAM_PARSE_TIMESTAMPS;
|
st->need_parsing = AVSTREAM_PARSE_TIMESTAMPS;
|
||||||
@ -658,7 +658,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
st->codec->codec_type = AVMEDIA_TYPE_DATA;
|
st->codec->codec_type = AVMEDIA_TYPE_DATA;
|
||||||
st->codec->codec_id= CODEC_ID_NONE;
|
st->codec->codec_id= CODEC_ID_NONE;
|
||||||
st->codec->codec_tag= 0;
|
st->codec->codec_tag= 0;
|
||||||
avio_seek(pb, size, SEEK_CUR);
|
avio_skip(pb, size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -693,7 +693,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
}
|
}
|
||||||
size -= 9*4;
|
size -= 9*4;
|
||||||
}
|
}
|
||||||
avio_seek(pb, size, SEEK_CUR);
|
avio_skip(pb, size);
|
||||||
break;
|
break;
|
||||||
case MKTAG('s', 't', 'r', 'n'):
|
case MKTAG('s', 't', 'r', 'n'):
|
||||||
if(s->nb_streams){
|
if(s->nb_streams){
|
||||||
@ -710,7 +710,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
}
|
}
|
||||||
/* skip tag */
|
/* skip tag */
|
||||||
size += (size & 1);
|
size += (size & 1);
|
||||||
avio_seek(pb, size, SEEK_CUR);
|
avio_skip(pb, size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -762,7 +762,7 @@ static int read_gab2_sub(AVStream *st, AVPacket *pkt) {
|
|||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
ret = avio_get_str16le(pb, desc_len, desc, sizeof(desc));
|
ret = avio_get_str16le(pb, desc_len, desc, sizeof(desc));
|
||||||
avio_seek(pb, desc_len - ret, SEEK_CUR);
|
avio_skip(pb, desc_len - ret);
|
||||||
if (*desc)
|
if (*desc)
|
||||||
av_metadata_set2(&st->metadata, "title", desc, 0);
|
av_metadata_set2(&st->metadata, "title", desc, 0);
|
||||||
|
|
||||||
@ -1008,14 +1008,14 @@ resync:
|
|||||||
//parse JUNK
|
//parse JUNK
|
||||||
||(d[0] == 'J' && d[1] == 'U' && d[2] == 'N' && d[3] == 'K')
|
||(d[0] == 'J' && d[1] == 'U' && d[2] == 'N' && d[3] == 'K')
|
||||||
||(d[0] == 'i' && d[1] == 'd' && d[2] == 'x' && d[3] == '1')){
|
||(d[0] == 'i' && d[1] == 'd' && d[2] == 'x' && d[3] == '1')){
|
||||||
avio_seek(pb, size, SEEK_CUR);
|
avio_skip(pb, size);
|
||||||
//av_log(s, AV_LOG_DEBUG, "SKIP\n");
|
//av_log(s, AV_LOG_DEBUG, "SKIP\n");
|
||||||
goto resync;
|
goto resync;
|
||||||
}
|
}
|
||||||
|
|
||||||
//parse stray LIST
|
//parse stray LIST
|
||||||
if(d[0] == 'L' && d[1] == 'I' && d[2] == 'S' && d[3] == 'T'){
|
if(d[0] == 'L' && d[1] == 'I' && d[2] == 'S' && d[3] == 'T'){
|
||||||
avio_seek(pb, 4, SEEK_CUR);
|
avio_skip(pb, 4);
|
||||||
goto resync;
|
goto resync;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1026,7 +1026,7 @@ resync:
|
|||||||
|
|
||||||
//detect ##ix chunk and skip
|
//detect ##ix chunk and skip
|
||||||
if(d[2] == 'i' && d[3] == 'x' && n < s->nb_streams){
|
if(d[2] == 'i' && d[3] == 'x' && n < s->nb_streams){
|
||||||
avio_seek(pb, size, SEEK_CUR);
|
avio_skip(pb, size);
|
||||||
goto resync;
|
goto resync;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1060,7 +1060,7 @@ resync:
|
|||||||
/*|| (st->discard >= AVDISCARD_NONKEY && !(pkt->flags & AV_PKT_FLAG_KEY))*/ //FIXME needs a little reordering
|
/*|| (st->discard >= AVDISCARD_NONKEY && !(pkt->flags & AV_PKT_FLAG_KEY))*/ //FIXME needs a little reordering
|
||||||
|| st->discard >= AVDISCARD_ALL){
|
|| st->discard >= AVDISCARD_ALL){
|
||||||
ast->frame_offset += get_duration(ast, size);
|
ast->frame_offset += get_duration(ast, size);
|
||||||
avio_seek(pb, size, SEEK_CUR);
|
avio_skip(pb, size);
|
||||||
goto resync;
|
goto resync;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1225,7 +1225,7 @@ static int avi_load_index(AVFormatContext *s)
|
|||||||
default:
|
default:
|
||||||
skip:
|
skip:
|
||||||
size += (size & 1);
|
size += (size & 1);
|
||||||
if (avio_seek(pb, size, SEEK_CUR) < 0)
|
if (avio_skip(pb, size) < 0)
|
||||||
goto the_end; // something is wrong here
|
goto the_end; // something is wrong here
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -393,7 +393,7 @@ static int avi_write_header(AVFormatContext *s)
|
|||||||
avi->movi_list = ff_start_tag(pb, "LIST");
|
avi->movi_list = ff_start_tag(pb, "LIST");
|
||||||
ffio_wfourcc(pb, "movi");
|
ffio_wfourcc(pb, "movi");
|
||||||
|
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -438,15 +438,15 @@ static int avi_write_ix(AVFormatContext *s)
|
|||||||
avio_wl32(pb, ((uint32_t)ie->len & ~0x80000000) |
|
avio_wl32(pb, ((uint32_t)ie->len & ~0x80000000) |
|
||||||
(ie->flags & 0x10 ? 0 : 0x80000000));
|
(ie->flags & 0x10 ? 0 : 0x80000000));
|
||||||
}
|
}
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
pos = avio_tell(pb);
|
pos = avio_tell(pb);
|
||||||
|
|
||||||
/* Updating one entry in the AVI OpenDML master index */
|
/* Updating one entry in the AVI OpenDML master index */
|
||||||
avio_seek(pb, avist->indexes.indx_start - 8, SEEK_SET);
|
avio_seek(pb, avist->indexes.indx_start - 8, SEEK_SET);
|
||||||
ffio_wfourcc(pb, "indx"); /* enabling this entry */
|
ffio_wfourcc(pb, "indx"); /* enabling this entry */
|
||||||
avio_seek(pb, 8, SEEK_CUR);
|
avio_skip(pb, 8);
|
||||||
avio_wl32(pb, avi->riff_id); /* nEntriesInUse */
|
avio_wl32(pb, avi->riff_id); /* nEntriesInUse */
|
||||||
avio_seek(pb, 16*avi->riff_id, SEEK_CUR);
|
avio_skip(pb, 16*avi->riff_id);
|
||||||
avio_wl64(pb, ix); /* qwOffset */
|
avio_wl64(pb, ix); /* qwOffset */
|
||||||
avio_wl32(pb, pos - ix); /* dwSize */
|
avio_wl32(pb, pos - ix); /* dwSize */
|
||||||
avio_wl32(pb, avist->indexes.entry); /* dwDuration */
|
avio_wl32(pb, avist->indexes.entry); /* dwDuration */
|
||||||
@ -578,7 +578,7 @@ static int avi_write_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
if (size & 1)
|
if (size & 1)
|
||||||
avio_w8(pb, 0);
|
avio_w8(pb, 0);
|
||||||
|
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -603,7 +603,7 @@ static int avi_write_trailer(AVFormatContext *s)
|
|||||||
file_size = avio_tell(pb);
|
file_size = avio_tell(pb);
|
||||||
avio_seek(pb, avi->odml_list - 8, SEEK_SET);
|
avio_seek(pb, avi->odml_list - 8, SEEK_SET);
|
||||||
ffio_wfourcc(pb, "LIST"); /* Making this AVI OpenDML one */
|
ffio_wfourcc(pb, "LIST"); /* Making this AVI OpenDML one */
|
||||||
avio_seek(pb, 16, SEEK_CUR);
|
avio_skip(pb, 16);
|
||||||
|
|
||||||
for (n=nb_frames=0;n<s->nb_streams;n++) {
|
for (n=nb_frames=0;n<s->nb_streams;n++) {
|
||||||
AVCodecContext *stream = s->streams[n]->codec;
|
AVCodecContext *stream = s->streams[n]->codec;
|
||||||
@ -624,7 +624,7 @@ static int avi_write_trailer(AVFormatContext *s)
|
|||||||
avi_write_counters(s, avi->riff_id);
|
avi_write_counters(s, avi->riff_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
|
|
||||||
for (i=0; i<s->nb_streams; i++) {
|
for (i=0; i<s->nb_streams; i++) {
|
||||||
AVIStream *avist= s->streams[i]->priv_data;
|
AVIStream *avist= s->streams[i]->priv_data;
|
||||||
|
@ -429,6 +429,13 @@ attribute_deprecated int64_t url_ftell(AVIOContext *s);
|
|||||||
attribute_deprecated int64_t url_fsize(AVIOContext *s);
|
attribute_deprecated int64_t url_fsize(AVIOContext *s);
|
||||||
#define URL_EOF (-1)
|
#define URL_EOF (-1)
|
||||||
attribute_deprecated int url_fgetc(AVIOContext *s);
|
attribute_deprecated int url_fgetc(AVIOContext *s);
|
||||||
|
attribute_deprecated int url_setbufsize(AVIOContext *s, int buf_size);
|
||||||
|
#ifdef __GNUC__
|
||||||
|
attribute_deprecated int url_fprintf(AVIOContext *s, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
|
||||||
|
#else
|
||||||
|
attribute_deprecated int url_fprintf(AVIOContext *s, const char *fmt, ...);
|
||||||
|
#endif
|
||||||
|
attribute_deprecated void put_flush_packet(AVIOContext *s);
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
@ -488,7 +495,10 @@ int64_t avio_skip(AVIOContext *s, int64_t offset);
|
|||||||
* ftell() equivalent for AVIOContext.
|
* ftell() equivalent for AVIOContext.
|
||||||
* @return position or AVERROR.
|
* @return position or AVERROR.
|
||||||
*/
|
*/
|
||||||
#define avio_tell(s) avio_seek((s), 0, SEEK_CUR)
|
static av_always_inline int64_t avio_tell(AVIOContext *s)
|
||||||
|
{
|
||||||
|
return avio_seek(s, 0, SEEK_CUR);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the filesize.
|
* Get the filesize.
|
||||||
@ -508,9 +518,9 @@ int64_t av_url_read_fseek(AVIOContext *h, int stream_index,
|
|||||||
|
|
||||||
/** @warning currently size is limited */
|
/** @warning currently size is limited */
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
int url_fprintf(AVIOContext *s, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
|
int avio_printf(AVIOContext *s, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
|
||||||
#else
|
#else
|
||||||
int url_fprintf(AVIOContext *s, const char *fmt, ...);
|
int avio_printf(AVIOContext *s, const char *fmt, ...);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if FF_API_OLD_AVIO
|
#if FF_API_OLD_AVIO
|
||||||
@ -519,7 +529,7 @@ int url_fprintf(AVIOContext *s, const char *fmt, ...);
|
|||||||
attribute_deprecated char *url_fgets(AVIOContext *s, char *buf, int buf_size);
|
attribute_deprecated char *url_fgets(AVIOContext *s, char *buf, int buf_size);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void put_flush_packet(AVIOContext *s);
|
void avio_flush(AVIOContext *s);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -570,8 +580,6 @@ unsigned int avio_rb24(AVIOContext *s);
|
|||||||
unsigned int avio_rb32(AVIOContext *s);
|
unsigned int avio_rb32(AVIOContext *s);
|
||||||
uint64_t avio_rb64(AVIOContext *s);
|
uint64_t avio_rb64(AVIOContext *s);
|
||||||
|
|
||||||
uint64_t ff_get_v(AVIOContext *bc);
|
|
||||||
|
|
||||||
static inline int url_is_streamed(AVIOContext *s)
|
static inline int url_is_streamed(AVIOContext *s)
|
||||||
{
|
{
|
||||||
return s->is_streamed;
|
return s->is_streamed;
|
||||||
@ -590,8 +598,6 @@ static inline int url_is_streamed(AVIOContext *s)
|
|||||||
*/
|
*/
|
||||||
int url_fdopen(AVIOContext **s, URLContext *h);
|
int url_fdopen(AVIOContext **s, URLContext *h);
|
||||||
|
|
||||||
/** @warning must be called before any I/O */
|
|
||||||
int url_setbufsize(AVIOContext *s, int buf_size);
|
|
||||||
#if FF_API_URL_RESETBUF
|
#if FF_API_URL_RESETBUF
|
||||||
/** Reset the buffer for reading or writing.
|
/** Reset the buffer for reading or writing.
|
||||||
* @note Will drop any data currently in the buffer without transmitting it.
|
* @note Will drop any data currently in the buffer without transmitting it.
|
||||||
@ -623,12 +629,12 @@ URLContext *url_fileno(AVIOContext *s);
|
|||||||
* @deprecated use AVIOContext.max_packet_size directly.
|
* @deprecated use AVIOContext.max_packet_size directly.
|
||||||
*/
|
*/
|
||||||
attribute_deprecated int url_fget_max_packet_size(AVIOContext *s);
|
attribute_deprecated int url_fget_max_packet_size(AVIOContext *s);
|
||||||
#endif
|
|
||||||
|
|
||||||
int url_open_buf(AVIOContext **s, uint8_t *buf, int buf_size, int flags);
|
attribute_deprecated int url_open_buf(AVIOContext **s, uint8_t *buf, int buf_size, int flags);
|
||||||
|
|
||||||
/** return the written or read size */
|
/** return the written or read size */
|
||||||
int url_close_buf(AVIOContext *s);
|
attribute_deprecated int url_close_buf(AVIOContext *s);
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open a write only memory stream.
|
* Open a write only memory stream.
|
||||||
|
@ -61,4 +61,9 @@ static av_always_inline void ffio_wfourcc(AVIOContext *pb, const uint8_t *s)
|
|||||||
*/
|
*/
|
||||||
int ffio_rewind_with_probe_data(AVIOContext *s, unsigned char *buf, int buf_size);
|
int ffio_rewind_with_probe_data(AVIOContext *s, unsigned char *buf, int buf_size);
|
||||||
|
|
||||||
|
uint64_t ffio_read_varlen(AVIOContext *bc);
|
||||||
|
|
||||||
|
/** @warning must be called before any I/O */
|
||||||
|
int ffio_set_buf_size(AVIOContext *s, int buf_size);
|
||||||
|
|
||||||
#endif // AVFORMAT_AVIO_INTERNAL_H
|
#endif // AVFORMAT_AVIO_INTERNAL_H
|
||||||
|
@ -170,7 +170,7 @@ void avio_write(AVIOContext *s, const unsigned char *buf, int size)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void put_flush_packet(AVIOContext *s)
|
void avio_flush(AVIOContext *s)
|
||||||
{
|
{
|
||||||
flush_buffer(s);
|
flush_buffer(s);
|
||||||
s->must_flush = 0;
|
s->must_flush = 0;
|
||||||
@ -386,6 +386,26 @@ int64_t url_fsize(AVIOContext *s)
|
|||||||
{
|
{
|
||||||
return avio_size(s);
|
return avio_size(s);
|
||||||
}
|
}
|
||||||
|
int url_setbufsize(AVIOContext *s, int buf_size)
|
||||||
|
{
|
||||||
|
return ffio_set_buf_size(s, buf_size);
|
||||||
|
}
|
||||||
|
int url_fprintf(AVIOContext *s, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
char buf[4096];
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
ret = vsnprintf(buf, sizeof(buf), fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
avio_write(s, buf, strlen(buf));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
void put_flush_packet(AVIOContext *s)
|
||||||
|
{
|
||||||
|
avio_flush(s);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int avio_put_str(AVIOContext *s, const char *str)
|
int avio_put_str(AVIOContext *s, const char *str)
|
||||||
@ -499,7 +519,7 @@ static void fill_buffer(AVIOContext *s)
|
|||||||
|
|
||||||
/* make buffer smaller in case it ended up large after probing */
|
/* make buffer smaller in case it ended up large after probing */
|
||||||
if (s->buffer_size > max_buffer_size) {
|
if (s->buffer_size > max_buffer_size) {
|
||||||
url_setbufsize(s, max_buffer_size);
|
ffio_set_buf_size(s, max_buffer_size);
|
||||||
|
|
||||||
s->checksum_ptr = dst = s->buffer;
|
s->checksum_ptr = dst = s->buffer;
|
||||||
len = s->buffer_size;
|
len = s->buffer_size;
|
||||||
@ -762,7 +782,7 @@ uint64_t avio_rb64(AVIOContext *s)
|
|||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t ff_get_v(AVIOContext *bc){
|
uint64_t ffio_read_varlen(AVIOContext *bc){
|
||||||
uint64_t val = 0;
|
uint64_t val = 0;
|
||||||
int tmp;
|
int tmp;
|
||||||
|
|
||||||
@ -810,7 +830,7 @@ int url_fdopen(AVIOContext **s, URLContext *h)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int url_setbufsize(AVIOContext *s, int buf_size)
|
int ffio_set_buf_size(AVIOContext *s, int buf_size)
|
||||||
{
|
{
|
||||||
uint8_t *buffer;
|
uint8_t *buffer;
|
||||||
buffer = av_malloc(buf_size);
|
buffer = av_malloc(buf_size);
|
||||||
@ -917,8 +937,7 @@ URLContext *url_fileno(AVIOContext *s)
|
|||||||
return s->opaque;
|
return s->opaque;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG_MUXERS
|
int avio_printf(AVIOContext *s, const char *fmt, ...)
|
||||||
int url_fprintf(AVIOContext *s, const char *fmt, ...)
|
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
char buf[4096];
|
char buf[4096];
|
||||||
@ -930,7 +949,6 @@ int url_fprintf(AVIOContext *s, const char *fmt, ...)
|
|||||||
avio_write(s, buf, strlen(buf));
|
avio_write(s, buf, strlen(buf));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif //CONFIG_MUXERS
|
|
||||||
|
|
||||||
#if FF_API_OLD_AVIO
|
#if FF_API_OLD_AVIO
|
||||||
char *url_fgets(AVIOContext *s, char *buf, int buf_size)
|
char *url_fgets(AVIOContext *s, char *buf, int buf_size)
|
||||||
@ -991,6 +1009,7 @@ int64_t av_url_read_fseek(AVIOContext *s, int stream_index,
|
|||||||
* back to the server even if CONFIG_MUXERS is false. */
|
* back to the server even if CONFIG_MUXERS is false. */
|
||||||
#if CONFIG_MUXERS || CONFIG_NETWORK
|
#if CONFIG_MUXERS || CONFIG_NETWORK
|
||||||
/* buffer handling */
|
/* buffer handling */
|
||||||
|
#if FF_API_OLD_AVIO
|
||||||
int url_open_buf(AVIOContext **s, uint8_t *buf, int buf_size, int flags)
|
int url_open_buf(AVIOContext **s, uint8_t *buf, int buf_size, int flags)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
@ -1007,9 +1026,10 @@ int url_open_buf(AVIOContext **s, uint8_t *buf, int buf_size, int flags)
|
|||||||
|
|
||||||
int url_close_buf(AVIOContext *s)
|
int url_close_buf(AVIOContext *s)
|
||||||
{
|
{
|
||||||
put_flush_packet(s);
|
avio_flush(s);
|
||||||
return s->buf_ptr - s->buffer;
|
return s->buf_ptr - s->buffer;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* output in a dynamic buffer */
|
/* output in a dynamic buffer */
|
||||||
|
|
||||||
@ -1134,7 +1154,7 @@ int url_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
|
|||||||
padding = FF_INPUT_BUFFER_PADDING_SIZE;
|
padding = FF_INPUT_BUFFER_PADDING_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
put_flush_packet(s);
|
avio_flush(s);
|
||||||
|
|
||||||
*pbuffer = d->buffer;
|
*pbuffer = d->buffer;
|
||||||
size = d->size;
|
size = d->size;
|
||||||
|
@ -61,7 +61,7 @@ static int avs_read_header(AVFormatContext * s, AVFormatParameters * ap)
|
|||||||
|
|
||||||
s->ctx_flags |= AVFMTCTX_NOHEADER;
|
s->ctx_flags |= AVFMTCTX_NOHEADER;
|
||||||
|
|
||||||
avio_seek(s->pb, 4, SEEK_CUR);
|
avio_skip(s->pb, 4);
|
||||||
avs->width = avio_rl16(s->pb);
|
avs->width = avio_rl16(s->pb);
|
||||||
avs->height = avio_rl16(s->pb);
|
avs->height = avio_rl16(s->pb);
|
||||||
avs->bits_per_sample = avio_rl16(s->pb);
|
avs->bits_per_sample = avio_rl16(s->pb);
|
||||||
@ -204,7 +204,7 @@ static int avs_read_packet(AVFormatContext * s, AVPacket * pkt)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
avio_seek(s->pb, size - 4, SEEK_CUR);
|
avio_skip(s->pb, size - 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,7 @@ static int vid_read_header(AVFormatContext *s,
|
|||||||
* bytes: 'V' 'I' 'D'
|
* bytes: 'V' 'I' 'D'
|
||||||
* int16s: always_512, nframes, width, height, delay, always_14
|
* int16s: always_512, nframes, width, height, delay, always_14
|
||||||
*/
|
*/
|
||||||
avio_seek(pb, 5, SEEK_CUR);
|
avio_skip(pb, 5);
|
||||||
vid->nframes = avio_rl16(pb);
|
vid->nframes = avio_rl16(pb);
|
||||||
|
|
||||||
stream = av_new_stream(s, 0);
|
stream = av_new_stream(s, 0);
|
||||||
|
@ -65,19 +65,19 @@ static int bfi_read_header(AVFormatContext * s, AVFormatParameters * ap)
|
|||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
/* Set the total number of frames. */
|
/* Set the total number of frames. */
|
||||||
avio_seek(pb, 8, SEEK_CUR);
|
avio_skip(pb, 8);
|
||||||
chunk_header = avio_rl32(pb);
|
chunk_header = avio_rl32(pb);
|
||||||
bfi->nframes = avio_rl32(pb);
|
bfi->nframes = avio_rl32(pb);
|
||||||
avio_rl32(pb);
|
avio_rl32(pb);
|
||||||
avio_rl32(pb);
|
avio_rl32(pb);
|
||||||
avio_rl32(pb);
|
avio_rl32(pb);
|
||||||
fps = avio_rl32(pb);
|
fps = avio_rl32(pb);
|
||||||
avio_seek(pb, 12, SEEK_CUR);
|
avio_skip(pb, 12);
|
||||||
vstream->codec->width = avio_rl32(pb);
|
vstream->codec->width = avio_rl32(pb);
|
||||||
vstream->codec->height = avio_rl32(pb);
|
vstream->codec->height = avio_rl32(pb);
|
||||||
|
|
||||||
/*Load the palette to extradata */
|
/*Load the palette to extradata */
|
||||||
avio_seek(pb, 8, SEEK_CUR);
|
avio_skip(pb, 8);
|
||||||
vstream->codec->extradata = av_malloc(768);
|
vstream->codec->extradata = av_malloc(768);
|
||||||
vstream->codec->extradata_size = 768;
|
vstream->codec->extradata_size = 768;
|
||||||
avio_read(pb, vstream->codec->extradata,
|
avio_read(pb, vstream->codec->extradata,
|
||||||
|
@ -98,7 +98,7 @@ static int read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
return AVERROR(EIO);
|
return AVERROR(EIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
avio_seek(pb, 4, SEEK_CUR);
|
avio_skip(pb, 4);
|
||||||
|
|
||||||
vst->codec->width = avio_rl32(pb);
|
vst->codec->width = avio_rl32(pb);
|
||||||
vst->codec->height = avio_rl32(pb);
|
vst->codec->height = avio_rl32(pb);
|
||||||
@ -127,7 +127,7 @@ static int read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (bink->num_audio_tracks) {
|
if (bink->num_audio_tracks) {
|
||||||
avio_seek(pb, 4 * bink->num_audio_tracks, SEEK_CUR);
|
avio_skip(pb, 4 * bink->num_audio_tracks);
|
||||||
|
|
||||||
for (i = 0; i < bink->num_audio_tracks; i++) {
|
for (i = 0; i < bink->num_audio_tracks; i++) {
|
||||||
ast = av_new_stream(s, 1);
|
ast = av_new_stream(s, 1);
|
||||||
@ -169,7 +169,7 @@ static int read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
keyframe ? AVINDEX_KEYFRAME : 0);
|
keyframe ? AVINDEX_KEYFRAME : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
avio_seek(pb, 4, SEEK_CUR);
|
avio_skip(pb, 4);
|
||||||
|
|
||||||
bink->current_track = -1;
|
bink->current_track = -1;
|
||||||
return 0;
|
return 0;
|
||||||
@ -225,7 +225,7 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
AV_RL32(pkt->data) / (2 * s->streams[bink->current_track]->codec->channels);
|
AV_RL32(pkt->data) / (2 * s->streams[bink->current_track]->codec->channels);
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
avio_seek(pb, audio_size, SEEK_CUR);
|
avio_skip(pb, audio_size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,7 +122,7 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
c93->audio->codec->codec_type = AVMEDIA_TYPE_AUDIO;
|
c93->audio->codec->codec_type = AVMEDIA_TYPE_AUDIO;
|
||||||
}
|
}
|
||||||
avio_seek(pb, 26, SEEK_CUR); /* VOC header */
|
avio_skip(pb, 26); /* VOC header */
|
||||||
ret = voc_get_packet(s, pkt, c93->audio, datasize - 26);
|
ret = voc_get_packet(s, pkt, c93->audio, datasize - 26);
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
pkt->stream_index = 1;
|
pkt->stream_index = 1;
|
||||||
|
@ -114,22 +114,22 @@ static int read_kuki_chunk(AVFormatContext *s, int64_t size)
|
|||||||
av_log(s, AV_LOG_ERROR, "invalid AAC magic cookie\n");
|
av_log(s, AV_LOG_ERROR, "invalid AAC magic cookie\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
avio_seek(pb, skip, SEEK_CUR);
|
avio_skip(pb, skip);
|
||||||
} else if (st->codec->codec_id == CODEC_ID_ALAC) {
|
} else if (st->codec->codec_id == CODEC_ID_ALAC) {
|
||||||
#define ALAC_PREAMBLE 12
|
#define ALAC_PREAMBLE 12
|
||||||
#define ALAC_HEADER 36
|
#define ALAC_HEADER 36
|
||||||
if (size < ALAC_PREAMBLE + ALAC_HEADER) {
|
if (size < ALAC_PREAMBLE + ALAC_HEADER) {
|
||||||
av_log(s, AV_LOG_ERROR, "invalid ALAC magic cookie\n");
|
av_log(s, AV_LOG_ERROR, "invalid ALAC magic cookie\n");
|
||||||
avio_seek(pb, size, SEEK_CUR);
|
avio_skip(pb, size);
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
avio_seek(pb, ALAC_PREAMBLE, SEEK_CUR);
|
avio_skip(pb, ALAC_PREAMBLE);
|
||||||
st->codec->extradata = av_mallocz(ALAC_HEADER + FF_INPUT_BUFFER_PADDING_SIZE);
|
st->codec->extradata = av_mallocz(ALAC_HEADER + FF_INPUT_BUFFER_PADDING_SIZE);
|
||||||
if (!st->codec->extradata)
|
if (!st->codec->extradata)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
avio_read(pb, st->codec->extradata, ALAC_HEADER);
|
avio_read(pb, st->codec->extradata, ALAC_HEADER);
|
||||||
st->codec->extradata_size = ALAC_HEADER;
|
st->codec->extradata_size = ALAC_HEADER;
|
||||||
avio_seek(pb, size - ALAC_PREAMBLE - ALAC_HEADER, SEEK_CUR);
|
avio_skip(pb, size - ALAC_PREAMBLE - ALAC_HEADER);
|
||||||
} else {
|
} else {
|
||||||
st->codec->extradata = av_mallocz(size + FF_INPUT_BUFFER_PADDING_SIZE);
|
st->codec->extradata = av_mallocz(size + FF_INPUT_BUFFER_PADDING_SIZE);
|
||||||
if (!st->codec->extradata)
|
if (!st->codec->extradata)
|
||||||
@ -201,7 +201,7 @@ static int read_header(AVFormatContext *s,
|
|||||||
int found_data, ret;
|
int found_data, ret;
|
||||||
int64_t size;
|
int64_t size;
|
||||||
|
|
||||||
avio_seek(pb, 8, SEEK_CUR); /* magic, version, file flags */
|
avio_skip(pb, 8); /* magic, version, file flags */
|
||||||
|
|
||||||
/* audio description chunk */
|
/* audio description chunk */
|
||||||
if (avio_rb32(pb) != MKBETAG('d','e','s','c')) {
|
if (avio_rb32(pb) != MKBETAG('d','e','s','c')) {
|
||||||
@ -233,11 +233,11 @@ static int read_header(AVFormatContext *s,
|
|||||||
|
|
||||||
switch (tag) {
|
switch (tag) {
|
||||||
case MKBETAG('d','a','t','a'):
|
case MKBETAG('d','a','t','a'):
|
||||||
avio_seek(pb, 4, SEEK_CUR); /* edit count */
|
avio_skip(pb, 4); /* edit count */
|
||||||
caf->data_start = avio_tell(pb);
|
caf->data_start = avio_tell(pb);
|
||||||
caf->data_size = size < 0 ? -1 : size - 4;
|
caf->data_size = size < 0 ? -1 : size - 4;
|
||||||
if (caf->data_size > 0 && !url_is_streamed(pb))
|
if (caf->data_size > 0 && !url_is_streamed(pb))
|
||||||
avio_seek(pb, caf->data_size, SEEK_CUR);
|
avio_skip(pb, caf->data_size);
|
||||||
found_data = 1;
|
found_data = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -265,7 +265,7 @@ static int read_header(AVFormatContext *s,
|
|||||||
case MKBETAG('f','r','e','e'):
|
case MKBETAG('f','r','e','e'):
|
||||||
if (size < 0)
|
if (size < 0)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
avio_seek(pb, size, SEEK_CUR);
|
avio_skip(pb, size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,7 @@ static int crc_write_trailer(struct AVFormatContext *s)
|
|||||||
|
|
||||||
snprintf(buf, sizeof(buf), "CRC=0x%08x\n", crc->crcval);
|
snprintf(buf, sizeof(buf), "CRC=0x%08x\n", crc->crcval);
|
||||||
avio_write(s->pb, buf, strlen(buf));
|
avio_write(s->pb, buf, strlen(buf));
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ static int daud_write_packet(struct AVFormatContext *s, AVPacket *pkt)
|
|||||||
avio_wb16(s->pb, pkt->size);
|
avio_wb16(s->pb, pkt->size);
|
||||||
avio_wb16(s->pb, 0x8010); // unknown
|
avio_wb16(s->pb, 0x8010); // unknown
|
||||||
avio_write(s->pb, pkt->data, pkt->size);
|
avio_write(s->pb, pkt->data, pkt->size);
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -382,7 +382,7 @@ static int dv_write_packet(struct AVFormatContext *s, AVPacket *pkt)
|
|||||||
pkt->data, pkt->size, &frame);
|
pkt->data, pkt->size, &frame);
|
||||||
if (fsize > 0) {
|
if (fsize > 0) {
|
||||||
avio_write(s->pb, frame, fsize);
|
avio_write(s->pb, frame, fsize);
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -96,7 +96,7 @@ static int dxa_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
c->has_sound = 1;
|
c->has_sound = 1;
|
||||||
size = avio_rb32(pb);
|
size = avio_rb32(pb);
|
||||||
c->vidpos = avio_tell(pb) + size;
|
c->vidpos = avio_tell(pb) + size;
|
||||||
avio_seek(pb, 16, SEEK_CUR);
|
avio_skip(pb, 16);
|
||||||
fsize = avio_rl32(pb);
|
fsize = avio_rl32(pb);
|
||||||
|
|
||||||
ast = av_new_stream(s, 0);
|
ast = av_new_stream(s, 0);
|
||||||
@ -108,7 +108,7 @@ static int dxa_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
tag = avio_rl32(pb);
|
tag = avio_rl32(pb);
|
||||||
fsize = avio_rl32(pb);
|
fsize = avio_rl32(pb);
|
||||||
if(tag == MKTAG('d', 'a', 't', 'a')) break;
|
if(tag == MKTAG('d', 'a', 't', 'a')) break;
|
||||||
avio_seek(pb, fsize, SEEK_CUR);
|
avio_skip(pb, fsize);
|
||||||
}
|
}
|
||||||
c->bpc = (fsize + c->frames - 1) / c->frames;
|
c->bpc = (fsize + c->frames - 1) / c->frames;
|
||||||
if(ast->codec->block_align)
|
if(ast->codec->block_align)
|
||||||
|
@ -62,7 +62,7 @@ static int cdata_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
};
|
};
|
||||||
|
|
||||||
sample_rate = avio_rb16(pb);
|
sample_rate = avio_rb16(pb);
|
||||||
avio_seek(pb, 12, SEEK_CUR);
|
avio_skip(pb, 12);
|
||||||
|
|
||||||
st = av_new_stream(s, 0);
|
st = av_new_stream(s, 0);
|
||||||
if (!st)
|
if (!st)
|
||||||
|
@ -222,7 +222,7 @@ static int process_audio_header_eacs(AVFormatContext *s)
|
|||||||
ea->bytes = avio_r8(pb); /* 1=8-bit, 2=16-bit */
|
ea->bytes = avio_r8(pb); /* 1=8-bit, 2=16-bit */
|
||||||
ea->num_channels = avio_r8(pb);
|
ea->num_channels = avio_r8(pb);
|
||||||
compression_type = avio_r8(pb);
|
compression_type = avio_r8(pb);
|
||||||
avio_seek(pb, 13, SEEK_CUR);
|
avio_skip(pb, 13);
|
||||||
|
|
||||||
switch (compression_type) {
|
switch (compression_type) {
|
||||||
case 0:
|
case 0:
|
||||||
@ -261,7 +261,7 @@ static int process_video_header_mdec(AVFormatContext *s)
|
|||||||
{
|
{
|
||||||
EaDemuxContext *ea = s->priv_data;
|
EaDemuxContext *ea = s->priv_data;
|
||||||
AVIOContext *pb = s->pb;
|
AVIOContext *pb = s->pb;
|
||||||
avio_seek(pb, 4, SEEK_CUR);
|
avio_skip(pb, 4);
|
||||||
ea->width = avio_rl16(pb);
|
ea->width = avio_rl16(pb);
|
||||||
ea->height = avio_rl16(pb);
|
ea->height = avio_rl16(pb);
|
||||||
ea->time_base = (AVRational){1,15};
|
ea->time_base = (AVRational){1,15};
|
||||||
@ -274,7 +274,7 @@ static int process_video_header_vp6(AVFormatContext *s)
|
|||||||
EaDemuxContext *ea = s->priv_data;
|
EaDemuxContext *ea = s->priv_data;
|
||||||
AVIOContext *pb = s->pb;
|
AVIOContext *pb = s->pb;
|
||||||
|
|
||||||
avio_seek(pb, 16, SEEK_CUR);
|
avio_skip(pb, 16);
|
||||||
ea->time_base.den = avio_rl32(pb);
|
ea->time_base.den = avio_rl32(pb);
|
||||||
ea->time_base.num = avio_rl32(pb);
|
ea->time_base.num = avio_rl32(pb);
|
||||||
ea->video_codec = CODEC_ID_VP6;
|
ea->video_codec = CODEC_ID_VP6;
|
||||||
@ -316,7 +316,7 @@ static int process_ea_header(AVFormatContext *s) {
|
|||||||
case SHEN_TAG :
|
case SHEN_TAG :
|
||||||
blockid = avio_rl32(pb);
|
blockid = avio_rl32(pb);
|
||||||
if (blockid == GSTR_TAG) {
|
if (blockid == GSTR_TAG) {
|
||||||
avio_seek(pb, 4, SEEK_CUR);
|
avio_skip(pb, 4);
|
||||||
} else if ((blockid & 0xFFFF)!=PT00_TAG) {
|
} else if ((blockid & 0xFFFF)!=PT00_TAG) {
|
||||||
av_log (s, AV_LOG_ERROR, "unknown SCHl headerid\n");
|
av_log (s, AV_LOG_ERROR, "unknown SCHl headerid\n");
|
||||||
return 0;
|
return 0;
|
||||||
@ -474,19 +474,19 @@ static int ea_read_packet(AVFormatContext *s,
|
|||||||
/* audio data */
|
/* audio data */
|
||||||
case ISNh_TAG:
|
case ISNh_TAG:
|
||||||
/* header chunk also contains data; skip over the header portion*/
|
/* header chunk also contains data; skip over the header portion*/
|
||||||
avio_seek(pb, 32, SEEK_CUR);
|
avio_skip(pb, 32);
|
||||||
chunk_size -= 32;
|
chunk_size -= 32;
|
||||||
case ISNd_TAG:
|
case ISNd_TAG:
|
||||||
case SCDl_TAG:
|
case SCDl_TAG:
|
||||||
case SNDC_TAG:
|
case SNDC_TAG:
|
||||||
case SDEN_TAG:
|
case SDEN_TAG:
|
||||||
if (!ea->audio_codec) {
|
if (!ea->audio_codec) {
|
||||||
avio_seek(pb, chunk_size, SEEK_CUR);
|
avio_skip(pb, chunk_size);
|
||||||
break;
|
break;
|
||||||
} else if (ea->audio_codec == CODEC_ID_PCM_S16LE_PLANAR ||
|
} else if (ea->audio_codec == CODEC_ID_PCM_S16LE_PLANAR ||
|
||||||
ea->audio_codec == CODEC_ID_MP3) {
|
ea->audio_codec == CODEC_ID_MP3) {
|
||||||
num_samples = avio_rl32(pb);
|
num_samples = avio_rl32(pb);
|
||||||
avio_seek(pb, 8, SEEK_CUR);
|
avio_skip(pb, 8);
|
||||||
chunk_size -= 12;
|
chunk_size -= 12;
|
||||||
}
|
}
|
||||||
ret = av_get_packet(pb, pkt, chunk_size);
|
ret = av_get_packet(pb, pkt, chunk_size);
|
||||||
@ -541,7 +541,7 @@ static int ea_read_packet(AVFormatContext *s,
|
|||||||
goto get_video_packet;
|
goto get_video_packet;
|
||||||
|
|
||||||
case mTCD_TAG:
|
case mTCD_TAG:
|
||||||
avio_seek(pb, 8, SEEK_CUR); // skip ea dct header
|
avio_skip(pb, 8); // skip ea dct header
|
||||||
chunk_size -= 8;
|
chunk_size -= 8;
|
||||||
goto get_video_packet;
|
goto get_video_packet;
|
||||||
|
|
||||||
@ -560,7 +560,7 @@ get_video_packet:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
avio_seek(pb, chunk_size, SEEK_CUR);
|
avio_skip(pb, chunk_size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -187,7 +187,7 @@ static int64_t get_dts(AVFormatContext *s, int64_t pos)
|
|||||||
int64_t dts;
|
int64_t dts;
|
||||||
|
|
||||||
ffm_seek1(s, pos);
|
ffm_seek1(s, pos);
|
||||||
avio_seek(pb, 4, SEEK_CUR);
|
avio_skip(pb, 4);
|
||||||
dts = avio_rb64(pb);
|
dts = avio_rb64(pb);
|
||||||
#ifdef DEBUG_SEEK
|
#ifdef DEBUG_SEEK
|
||||||
av_log(s, AV_LOG_DEBUG, "dts=%0.6f\n", dts / 1000000.0);
|
av_log(s, AV_LOG_DEBUG, "dts=%0.6f\n", dts / 1000000.0);
|
||||||
|
@ -44,7 +44,7 @@ static void flush_packet(AVFormatContext *s)
|
|||||||
h |= 0x8000;
|
h |= 0x8000;
|
||||||
avio_wb16(pb, h);
|
avio_wb16(pb, h);
|
||||||
avio_write(pb, ffm->packet, ffm->packet_end - ffm->packet);
|
avio_write(pb, ffm->packet, ffm->packet_end - ffm->packet);
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
|
|
||||||
/* prepare next packet */
|
/* prepare next packet */
|
||||||
ffm->frame_offset = 0; /* no key frame */
|
ffm->frame_offset = 0; /* no key frame */
|
||||||
@ -187,7 +187,7 @@ static int ffm_write_header(AVFormatContext *s)
|
|||||||
while ((avio_tell(pb) % ffm->packet_size) != 0)
|
while ((avio_tell(pb) % ffm->packet_size) != 0)
|
||||||
avio_w8(pb, 0);
|
avio_w8(pb, 0);
|
||||||
|
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
|
|
||||||
/* init packet mux */
|
/* init packet mux */
|
||||||
ffm->packet_ptr = ffm->packet;
|
ffm->packet_ptr = ffm->packet;
|
||||||
@ -235,7 +235,7 @@ static int ffm_write_trailer(AVFormatContext *s)
|
|||||||
if (ffm->packet_ptr > ffm->packet)
|
if (ffm->packet_ptr > ffm->packet)
|
||||||
flush_packet(s);
|
flush_packet(s);
|
||||||
|
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ static int write_header(AVFormatContext *s)
|
|||||||
avio_write(s->pb, ID_STRING, sizeof(ID_STRING) - 1);
|
avio_write(s->pb, ID_STRING, sizeof(ID_STRING) - 1);
|
||||||
avio_w8(s->pb, '1'); // version
|
avio_w8(s->pb, '1'); // version
|
||||||
avio_w8(s->pb, '\n');
|
avio_w8(s->pb, '\n');
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,13 +73,13 @@ static int write_trailer(AVFormatContext *s)
|
|||||||
AVChapter *ch = s->chapters[i];
|
AVChapter *ch = s->chapters[i];
|
||||||
avio_write(s->pb, ID_CHAPTER, sizeof(ID_CHAPTER) - 1);
|
avio_write(s->pb, ID_CHAPTER, sizeof(ID_CHAPTER) - 1);
|
||||||
avio_w8(s->pb, '\n');
|
avio_w8(s->pb, '\n');
|
||||||
url_fprintf(s->pb, "TIMEBASE=%d/%d\n", ch->time_base.num, ch->time_base.den);
|
avio_printf(s->pb, "TIMEBASE=%d/%d\n", ch->time_base.num, ch->time_base.den);
|
||||||
url_fprintf(s->pb, "START=%"PRId64"\n", ch->start);
|
avio_printf(s->pb, "START=%"PRId64"\n", ch->start);
|
||||||
url_fprintf(s->pb, "END=%"PRId64"\n", ch->end);
|
avio_printf(s->pb, "END=%"PRId64"\n", ch->end);
|
||||||
write_tags(s->pb, ch->metadata);
|
write_tags(s->pb, ch->metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -59,7 +59,7 @@ static int read_header(AVFormatContext *s,
|
|||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
avio_seek(pb, 2, SEEK_CUR);
|
avio_skip(pb, 2);
|
||||||
st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
|
st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
|
||||||
st->codec->codec_id = CODEC_ID_RAWVIDEO;
|
st->codec->codec_id = CODEC_ID_RAWVIDEO;
|
||||||
st->codec->pix_fmt = PIX_FMT_RGBA;
|
st->codec->pix_fmt = PIX_FMT_RGBA;
|
||||||
@ -84,7 +84,7 @@ static int read_packet(AVFormatContext *s,
|
|||||||
return AVERROR(EIO);
|
return AVERROR(EIO);
|
||||||
pkt->dts = avio_tell(s->pb) / (st->codec->width * (st->codec->height + film->leading) * 4);
|
pkt->dts = avio_tell(s->pb) / (st->codec->width * (st->codec->height + film->leading) * 4);
|
||||||
pkt->size = av_get_packet(s->pb, pkt, st->codec->width * st->codec->height * 4);
|
pkt->size = av_get_packet(s->pb, pkt, st->codec->width * st->codec->height * 4);
|
||||||
avio_seek(s->pb, st->codec->width * film->leading * 4, SEEK_CUR);
|
avio_skip(s->pb, st->codec->width * film->leading * 4);
|
||||||
if (pkt->size < 0)
|
if (pkt->size < 0)
|
||||||
return pkt->size;
|
return pkt->size;
|
||||||
pkt->flags |= AV_PKT_FLAG_KEY;
|
pkt->flags |= AV_PKT_FLAG_KEY;
|
||||||
|
@ -67,7 +67,7 @@ static int write_trailer(AVFormatContext *s)
|
|||||||
avio_wb16(pb, 1/av_q2d(st->codec->time_base));
|
avio_wb16(pb, 1/av_q2d(st->codec->time_base));
|
||||||
for (i = 0; i < 16; i++)
|
for (i = 0; i < 16; i++)
|
||||||
avio_w8(pb, 0x00); // reserved
|
avio_w8(pb, 0x00); // reserved
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ static int flac_read_header(AVFormatContext *s,
|
|||||||
break;
|
break;
|
||||||
/* skip metadata block for unsupported types */
|
/* skip metadata block for unsupported types */
|
||||||
default:
|
default:
|
||||||
ret = avio_seek(s->pb, metadata_size, SEEK_CUR);
|
ret = avio_skip(s->pb, metadata_size);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@ static int flac_write_trailer(struct AVFormatContext *s)
|
|||||||
avio_seek(pb, 8, SEEK_SET);
|
avio_seek(pb, 8, SEEK_SET);
|
||||||
avio_write(pb, streaminfo, FLAC_STREAMINFO_SIZE);
|
avio_write(pb, streaminfo, FLAC_STREAMINFO_SIZE);
|
||||||
avio_seek(pb, file_size, SEEK_SET);
|
avio_seek(pb, file_size, SEEK_SET);
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
} else {
|
} else {
|
||||||
av_log(s, AV_LOG_WARNING, "unable to rewrite FLAC header.\n");
|
av_log(s, AV_LOG_WARNING, "unable to rewrite FLAC header.\n");
|
||||||
}
|
}
|
||||||
@ -114,7 +114,7 @@ static int flac_write_trailer(struct AVFormatContext *s)
|
|||||||
static int flac_write_packet(struct AVFormatContext *s, AVPacket *pkt)
|
static int flac_write_packet(struct AVFormatContext *s, AVPacket *pkt)
|
||||||
{
|
{
|
||||||
avio_write(s->pb, pkt->data, pkt->size);
|
avio_write(s->pb, pkt->data, pkt->size);
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -239,7 +239,7 @@ static int flic_read_packet(AVFormatContext *s,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* skip useless 10B sub-header (yes, it's not accounted for in the chunk header) */
|
/* skip useless 10B sub-header (yes, it's not accounted for in the chunk header) */
|
||||||
avio_seek(pb, 10, SEEK_CUR);
|
avio_skip(pb, 10);
|
||||||
|
|
||||||
pkt->stream_index = flic->audio_stream_index;
|
pkt->stream_index = flic->audio_stream_index;
|
||||||
pkt->pos = avio_tell(pb);
|
pkt->pos = avio_tell(pb);
|
||||||
@ -253,7 +253,7 @@ static int flic_read_packet(AVFormatContext *s,
|
|||||||
packet_read = 1;
|
packet_read = 1;
|
||||||
} else {
|
} else {
|
||||||
/* not interested in this chunk */
|
/* not interested in this chunk */
|
||||||
avio_seek(pb, size - 6, SEEK_CUR);
|
avio_skip(pb, size - 6);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,7 +113,7 @@ static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream, int flv_co
|
|||||||
static int amf_get_string(AVIOContext *ioc, char *buffer, int buffsize) {
|
static int amf_get_string(AVIOContext *ioc, char *buffer, int buffsize) {
|
||||||
int length = avio_rb16(ioc);
|
int length = avio_rb16(ioc);
|
||||||
if(length >= buffsize) {
|
if(length >= buffsize) {
|
||||||
avio_seek(ioc, length, SEEK_CUR);
|
avio_skip(ioc, length);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,7 +149,7 @@ static int amf_parse_object(AVFormatContext *s, AVStream *astream, AVStream *vst
|
|||||||
unsigned int keylen;
|
unsigned int keylen;
|
||||||
|
|
||||||
while(avio_tell(ioc) < max_pos - 2 && (keylen = avio_rb16(ioc))) {
|
while(avio_tell(ioc) < max_pos - 2 && (keylen = avio_rb16(ioc))) {
|
||||||
avio_seek(ioc, keylen, SEEK_CUR); //skip key string
|
avio_skip(ioc, keylen); //skip key string
|
||||||
if(amf_parse_object(s, NULL, NULL, NULL, max_pos, depth + 1) < 0)
|
if(amf_parse_object(s, NULL, NULL, NULL, max_pos, depth + 1) < 0)
|
||||||
return -1; //if we couldn't skip, bomb out.
|
return -1; //if we couldn't skip, bomb out.
|
||||||
}
|
}
|
||||||
@ -162,7 +162,7 @@ static int amf_parse_object(AVFormatContext *s, AVStream *astream, AVStream *vst
|
|||||||
case AMF_DATA_TYPE_UNSUPPORTED:
|
case AMF_DATA_TYPE_UNSUPPORTED:
|
||||||
break; //these take up no additional space
|
break; //these take up no additional space
|
||||||
case AMF_DATA_TYPE_MIXEDARRAY:
|
case AMF_DATA_TYPE_MIXEDARRAY:
|
||||||
avio_seek(ioc, 4, SEEK_CUR); //skip 32-bit max array index
|
avio_skip(ioc, 4); //skip 32-bit max array index
|
||||||
while(avio_tell(ioc) < max_pos - 2 && amf_get_string(ioc, str_val, sizeof(str_val)) > 0) {
|
while(avio_tell(ioc) < max_pos - 2 && amf_get_string(ioc, str_val, sizeof(str_val)) > 0) {
|
||||||
//this is the only case in which we would want a nested parse to not skip over the object
|
//this is the only case in which we would want a nested parse to not skip over the object
|
||||||
if(amf_parse_object(s, astream, vstream, str_val, max_pos, depth + 1) < 0)
|
if(amf_parse_object(s, astream, vstream, str_val, max_pos, depth + 1) < 0)
|
||||||
@ -182,7 +182,7 @@ static int amf_parse_object(AVFormatContext *s, AVStream *astream, AVStream *vst
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case AMF_DATA_TYPE_DATE:
|
case AMF_DATA_TYPE_DATE:
|
||||||
avio_seek(ioc, 8 + 2, SEEK_CUR); //timestamp (double) and UTC offset (int16)
|
avio_skip(ioc, 8 + 2); //timestamp (double) and UTC offset (int16)
|
||||||
break;
|
break;
|
||||||
default: //unsupported type, we couldn't skip
|
default: //unsupported type, we couldn't skip
|
||||||
return -1;
|
return -1;
|
||||||
@ -254,7 +254,7 @@ static int flv_read_header(AVFormatContext *s,
|
|||||||
{
|
{
|
||||||
int offset, flags;
|
int offset, flags;
|
||||||
|
|
||||||
avio_seek(s->pb, 4, SEEK_CUR);
|
avio_skip(s->pb, 4);
|
||||||
flags = avio_r8(s->pb);
|
flags = avio_r8(s->pb);
|
||||||
/* old flvtool cleared this field */
|
/* old flvtool cleared this field */
|
||||||
/* FIXME: better fix needed */
|
/* FIXME: better fix needed */
|
||||||
@ -278,7 +278,7 @@ static int flv_read_header(AVFormatContext *s,
|
|||||||
|
|
||||||
offset = avio_rb32(s->pb);
|
offset = avio_rb32(s->pb);
|
||||||
avio_seek(s->pb, offset, SEEK_SET);
|
avio_seek(s->pb, offset, SEEK_SET);
|
||||||
avio_seek(s->pb, 4, SEEK_CUR);
|
avio_skip(s->pb, 4);
|
||||||
|
|
||||||
s->start_time = 0;
|
s->start_time = 0;
|
||||||
|
|
||||||
@ -304,7 +304,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
int64_t dts, pts = AV_NOPTS_VALUE;
|
int64_t dts, pts = AV_NOPTS_VALUE;
|
||||||
AVStream *st = NULL;
|
AVStream *st = NULL;
|
||||||
|
|
||||||
for(;;avio_seek(s->pb, 4, SEEK_CUR)){ /* pkt size is repeated at end. skip it */
|
for(;;avio_skip(s->pb, 4)){ /* pkt size is repeated at end. skip it */
|
||||||
pos = avio_tell(s->pb);
|
pos = avio_tell(s->pb);
|
||||||
type = avio_r8(s->pb);
|
type = avio_r8(s->pb);
|
||||||
size = avio_rb24(s->pb);
|
size = avio_rb24(s->pb);
|
||||||
@ -313,7 +313,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
// av_log(s, AV_LOG_DEBUG, "type:%d, size:%d, dts:%d\n", type, size, dts);
|
// av_log(s, AV_LOG_DEBUG, "type:%d, size:%d, dts:%d\n", type, size, dts);
|
||||||
if (url_feof(s->pb))
|
if (url_feof(s->pb))
|
||||||
return AVERROR_EOF;
|
return AVERROR_EOF;
|
||||||
avio_seek(s->pb, 3, SEEK_CUR); /* stream id, always 0 */
|
avio_skip(s->pb, 3); /* stream id, always 0 */
|
||||||
flags = 0;
|
flags = 0;
|
||||||
|
|
||||||
if(size == 0)
|
if(size == 0)
|
||||||
@ -454,7 +454,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
pkt->flags |= AV_PKT_FLAG_KEY;
|
pkt->flags |= AV_PKT_FLAG_KEY;
|
||||||
|
|
||||||
leave:
|
leave:
|
||||||
avio_seek(s->pb, 4, SEEK_CUR);
|
avio_skip(s->pb, 4);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,7 +291,7 @@ static int flv_write_header(AVFormatContext *s)
|
|||||||
data_size= avio_tell(pb) - metadata_size_pos - 10;
|
data_size= avio_tell(pb) - metadata_size_pos - 10;
|
||||||
avio_seek(pb, metadata_size_pos, SEEK_SET);
|
avio_seek(pb, metadata_size_pos, SEEK_SET);
|
||||||
avio_wb24(pb, data_size);
|
avio_wb24(pb, data_size);
|
||||||
avio_seek(pb, data_size + 10 - 3, SEEK_CUR);
|
avio_skip(pb, data_size + 10 - 3);
|
||||||
avio_wb32(pb, data_size + 11);
|
avio_wb32(pb, data_size + 11);
|
||||||
|
|
||||||
for (i = 0; i < s->nb_streams; i++) {
|
for (i = 0; i < s->nb_streams; i++) {
|
||||||
@ -318,7 +318,7 @@ static int flv_write_header(AVFormatContext *s)
|
|||||||
data_size = avio_tell(pb) - pos;
|
data_size = avio_tell(pb) - pos;
|
||||||
avio_seek(pb, -data_size - 10, SEEK_CUR);
|
avio_seek(pb, -data_size - 10, SEEK_CUR);
|
||||||
avio_wb24(pb, data_size);
|
avio_wb24(pb, data_size);
|
||||||
avio_seek(pb, data_size + 10 - 3, SEEK_CUR);
|
avio_skip(pb, data_size + 10 - 3);
|
||||||
avio_wb32(pb, data_size + 11); // previous tag size
|
avio_wb32(pb, data_size + 11); // previous tag size
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -430,7 +430,7 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
avio_wb32(pb,size+flags_size+11); // previous tag size
|
avio_wb32(pb,size+flags_size+11); // previous tag size
|
||||||
flv->duration = FFMAX(flv->duration, pkt->pts + flv->delay + pkt->duration);
|
flv->duration = FFMAX(flv->duration, pkt->pts + flv->delay + pkt->duration);
|
||||||
|
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
|
|
||||||
av_free(data);
|
av_free(data);
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ static int framecrc_write_packet(struct AVFormatContext *s, AVPacket *pkt)
|
|||||||
|
|
||||||
snprintf(buf, sizeof(buf), "%d, %"PRId64", %d, 0x%08x\n", pkt->stream_index, pkt->dts, pkt->size, crc);
|
snprintf(buf, sizeof(buf), "%d, %"PRId64", %d, 0x%08x\n", pkt->stream_index, pkt->dts, pkt->size, crc);
|
||||||
avio_write(s->pb, buf, strlen(buf));
|
avio_write(s->pb, buf, strlen(buf));
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,7 +287,7 @@ static int gif_write_header(AVFormatContext *s)
|
|||||||
|
|
||||||
gif_image_write_header(pb, width, height, loop_count, NULL);
|
gif_image_write_header(pb, width, height, loop_count, NULL);
|
||||||
|
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -322,7 +322,7 @@ static int gif_write_video(AVFormatContext *s,
|
|||||||
gif_image_write_image(pb, 0, 0, enc->width, enc->height,
|
gif_image_write_image(pb, 0, 0, enc->width, enc->height,
|
||||||
buf, enc->width * 3, PIX_FMT_RGB24);
|
buf, enc->width * 3, PIX_FMT_RGB24);
|
||||||
|
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -340,7 +340,7 @@ static int gif_write_trailer(AVFormatContext *s)
|
|||||||
AVIOContext *pb = s->pb;
|
AVIOContext *pb = s->pb;
|
||||||
|
|
||||||
avio_w8(pb, 0x3b);
|
avio_w8(pb, 0x3b);
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,7 +174,7 @@ static void gxf_material_tags(AVIOContext *pb, int *len, struct gxf_stream_info
|
|||||||
else if (tag == MAT_LAST_FIELD)
|
else if (tag == MAT_LAST_FIELD)
|
||||||
si->last_field = value;
|
si->last_field = value;
|
||||||
} else
|
} else
|
||||||
avio_seek(pb, tlen, SEEK_CUR);
|
avio_skip(pb, tlen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,7 +223,7 @@ static void gxf_track_tags(AVIOContext *pb, int *len, struct gxf_stream_info *si
|
|||||||
else if (tag == TRACK_FPF && (value == 1 || value == 2))
|
else if (tag == TRACK_FPF && (value == 1 || value == 2))
|
||||||
si->fields_per_frame = value;
|
si->fields_per_frame = value;
|
||||||
} else
|
} else
|
||||||
avio_seek(pb, tlen, SEEK_CUR);
|
avio_skip(pb, tlen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -238,7 +238,7 @@ static void gxf_read_index(AVFormatContext *s, int pkt_len) {
|
|||||||
int i;
|
int i;
|
||||||
pkt_len -= 8;
|
pkt_len -= 8;
|
||||||
if (s->flags & AVFMT_FLAG_IGNIDX) {
|
if (s->flags & AVFMT_FLAG_IGNIDX) {
|
||||||
avio_seek(pb, pkt_len, SEEK_CUR);
|
avio_skip(pb, pkt_len);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (map_cnt > 1000) {
|
if (map_cnt > 1000) {
|
||||||
@ -247,7 +247,7 @@ static void gxf_read_index(AVFormatContext *s, int pkt_len) {
|
|||||||
}
|
}
|
||||||
if (pkt_len < 4 * map_cnt) {
|
if (pkt_len < 4 * map_cnt) {
|
||||||
av_log(s, AV_LOG_ERROR, "invalid index length\n");
|
av_log(s, AV_LOG_ERROR, "invalid index length\n");
|
||||||
avio_seek(pb, pkt_len, SEEK_CUR);
|
avio_skip(pb, pkt_len);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pkt_len -= 4 * map_cnt;
|
pkt_len -= 4 * map_cnt;
|
||||||
@ -255,7 +255,7 @@ static void gxf_read_index(AVFormatContext *s, int pkt_len) {
|
|||||||
for (i = 0; i < map_cnt; i++)
|
for (i = 0; i < map_cnt; i++)
|
||||||
av_add_index_entry(st, (uint64_t)avio_rl32(pb) * 1024,
|
av_add_index_entry(st, (uint64_t)avio_rl32(pb) * 1024,
|
||||||
i * (uint64_t)fields_per_map + 1, 0, 0, 0);
|
i * (uint64_t)fields_per_map + 1, 0, 0, 0);
|
||||||
avio_seek(pb, pkt_len, SEEK_CUR);
|
avio_skip(pb, pkt_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gxf_header(AVFormatContext *s, AVFormatParameters *ap) {
|
static int gxf_header(AVFormatContext *s, AVFormatParameters *ap) {
|
||||||
@ -283,7 +283,7 @@ static int gxf_header(AVFormatContext *s, AVFormatParameters *ap) {
|
|||||||
}
|
}
|
||||||
map_len -= len;
|
map_len -= len;
|
||||||
gxf_material_tags(pb, &len, &si);
|
gxf_material_tags(pb, &len, &si);
|
||||||
avio_seek(pb, len, SEEK_CUR);
|
avio_skip(pb, len);
|
||||||
map_len -= 2;
|
map_len -= 2;
|
||||||
len = avio_rb16(pb); // length of track description
|
len = avio_rb16(pb); // length of track description
|
||||||
if (len > map_len) {
|
if (len > map_len) {
|
||||||
@ -301,7 +301,7 @@ static int gxf_header(AVFormatContext *s, AVFormatParameters *ap) {
|
|||||||
track_len = avio_rb16(pb);
|
track_len = avio_rb16(pb);
|
||||||
len -= track_len;
|
len -= track_len;
|
||||||
gxf_track_tags(pb, &track_len, &si);
|
gxf_track_tags(pb, &track_len, &si);
|
||||||
avio_seek(pb, track_len, SEEK_CUR);
|
avio_skip(pb, track_len);
|
||||||
if (!(track_type & 0x80)) {
|
if (!(track_type & 0x80)) {
|
||||||
av_log(s, AV_LOG_ERROR, "invalid track type %x\n", track_type);
|
av_log(s, AV_LOG_ERROR, "invalid track type %x\n", track_type);
|
||||||
continue;
|
continue;
|
||||||
@ -326,7 +326,7 @@ static int gxf_header(AVFormatContext *s, AVFormatParameters *ap) {
|
|||||||
if (len < 0)
|
if (len < 0)
|
||||||
av_log(s, AV_LOG_ERROR, "invalid track description length specified\n");
|
av_log(s, AV_LOG_ERROR, "invalid track description length specified\n");
|
||||||
if (map_len)
|
if (map_len)
|
||||||
avio_seek(pb, map_len, SEEK_CUR);
|
avio_skip(pb, map_len);
|
||||||
if (!parse_packet_header(pb, &pkt_type, &len)) {
|
if (!parse_packet_header(pb, &pkt_type, &len)) {
|
||||||
av_log(s, AV_LOG_ERROR, "sync lost in header\n");
|
av_log(s, AV_LOG_ERROR, "sync lost in header\n");
|
||||||
return -1;
|
return -1;
|
||||||
@ -342,8 +342,8 @@ static int gxf_header(AVFormatContext *s, AVFormatParameters *ap) {
|
|||||||
if (len >= 0x39) {
|
if (len >= 0x39) {
|
||||||
AVRational fps;
|
AVRational fps;
|
||||||
len -= 0x39;
|
len -= 0x39;
|
||||||
avio_seek(pb, 5, SEEK_CUR); // preamble
|
avio_skip(pb, 5); // preamble
|
||||||
avio_seek(pb, 0x30, SEEK_CUR); // payload description
|
avio_skip(pb, 0x30); // payload description
|
||||||
fps = fps_umf2avr(avio_rl32(pb));
|
fps = fps_umf2avr(avio_rl32(pb));
|
||||||
if (!main_timebase.num || !main_timebase.den) {
|
if (!main_timebase.num || !main_timebase.den) {
|
||||||
// this may not always be correct, but simply the best we can get
|
// this may not always be correct, but simply the best we can get
|
||||||
@ -354,7 +354,7 @@ static int gxf_header(AVFormatContext *s, AVFormatParameters *ap) {
|
|||||||
av_log(s, AV_LOG_INFO, "UMF packet too short\n");
|
av_log(s, AV_LOG_INFO, "UMF packet too short\n");
|
||||||
} else
|
} else
|
||||||
av_log(s, AV_LOG_INFO, "UMF packet missing\n");
|
av_log(s, AV_LOG_INFO, "UMF packet missing\n");
|
||||||
avio_seek(pb, len, SEEK_CUR);
|
avio_skip(pb, len);
|
||||||
// set a fallback value, 60000/1001 is specified for audio-only files
|
// set a fallback value, 60000/1001 is specified for audio-only files
|
||||||
// so use that regardless of why we do not know the video frame rate.
|
// so use that regardless of why we do not know the video frame rate.
|
||||||
if (!main_timebase.num || !main_timebase.den)
|
if (!main_timebase.num || !main_timebase.den)
|
||||||
@ -437,7 +437,7 @@ static int gxf_packet(AVFormatContext *s, AVPacket *pkt) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (pkt_type != PKT_MEDIA) {
|
if (pkt_type != PKT_MEDIA) {
|
||||||
avio_seek(pb, pkt_len, SEEK_CUR);
|
avio_skip(pb, pkt_len);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (pkt_len < 16) {
|
if (pkt_len < 16) {
|
||||||
@ -462,7 +462,7 @@ static int gxf_packet(AVFormatContext *s, AVPacket *pkt) {
|
|||||||
int last = field_info & 0xffff; // last is exclusive
|
int last = field_info & 0xffff; // last is exclusive
|
||||||
int bps = av_get_bits_per_sample(st->codec->codec_id)>>3;
|
int bps = av_get_bits_per_sample(st->codec->codec_id)>>3;
|
||||||
if (first <= last && last*bps <= pkt_len) {
|
if (first <= last && last*bps <= pkt_len) {
|
||||||
avio_seek(pb, first*bps, SEEK_CUR);
|
avio_skip(pb, first*bps);
|
||||||
skip = pkt_len - last*bps;
|
skip = pkt_len - last*bps;
|
||||||
pkt_len = (last-first)*bps;
|
pkt_len = (last-first)*bps;
|
||||||
} else
|
} else
|
||||||
@ -470,7 +470,7 @@ static int gxf_packet(AVFormatContext *s, AVPacket *pkt) {
|
|||||||
}
|
}
|
||||||
ret = av_get_packet(pb, pkt, pkt_len);
|
ret = av_get_packet(pb, pkt, pkt_len);
|
||||||
if (skip)
|
if (skip)
|
||||||
avio_seek(pb, skip, SEEK_CUR);
|
avio_skip(pb, skip);
|
||||||
pkt->stream_index = stream_index;
|
pkt->stream_index = stream_index;
|
||||||
pkt->dts = field_nr;
|
pkt->dts = field_nr;
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -753,7 +753,7 @@ static int gxf_write_header(AVFormatContext *s)
|
|||||||
|
|
||||||
gxf->packet_count = 3;
|
gxf->packet_count = 3;
|
||||||
|
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -781,12 +781,12 @@ static int gxf_write_trailer(AVFormatContext *s)
|
|||||||
gxf_write_map_packet(s, 1);
|
gxf_write_map_packet(s, 1);
|
||||||
gxf_write_flt_packet(s);
|
gxf_write_flt_packet(s);
|
||||||
gxf_write_umf_packet(s);
|
gxf_write_umf_packet(s);
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
/* update duration in all map packets */
|
/* update duration in all map packets */
|
||||||
for (i = 1; i < gxf->map_offsets_nb; i++) {
|
for (i = 1; i < gxf->map_offsets_nb; i++) {
|
||||||
avio_seek(pb, gxf->map_offsets[i], SEEK_SET);
|
avio_seek(pb, gxf->map_offsets[i], SEEK_SET);
|
||||||
gxf_write_map_packet(s, 1);
|
gxf_write_map_packet(s, 1);
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
}
|
}
|
||||||
|
|
||||||
avio_seek(pb, end, SEEK_SET);
|
avio_seek(pb, end, SEEK_SET);
|
||||||
@ -895,7 +895,7 @@ static int gxf_write_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
gxf->packet_count = 0;
|
gxf->packet_count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
put_flush_packet(pb);
|
avio_flush(pb);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -136,6 +136,52 @@ static void read_ttag(AVFormatContext *s, AVIOContext *pb, int taglen, const cha
|
|||||||
av_metadata_set2(&s->metadata, key, val, AV_METADATA_DONT_OVERWRITE);
|
av_metadata_set2(&s->metadata, key, val, AV_METADATA_DONT_OVERWRITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int is_number(const char *str)
|
||||||
|
{
|
||||||
|
while (*str >= '0' && *str <= '9') str++;
|
||||||
|
return !*str;
|
||||||
|
}
|
||||||
|
|
||||||
|
static AVMetadataTag* get_date_tag(AVMetadata *m, const char *tag)
|
||||||
|
{
|
||||||
|
AVMetadataTag *t;
|
||||||
|
if ((t = av_metadata_get(m, tag, NULL, AV_METADATA_MATCH_CASE)) &&
|
||||||
|
strlen(t->value) == 4 && is_number(t->value))
|
||||||
|
return t;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void merge_date(AVMetadata **m)
|
||||||
|
{
|
||||||
|
AVMetadataTag *t;
|
||||||
|
char date[17] = {0}; // YYYY-MM-DD hh:mm
|
||||||
|
|
||||||
|
if (!(t = get_date_tag(*m, "TYER")) &&
|
||||||
|
!(t = get_date_tag(*m, "TYE")))
|
||||||
|
return;
|
||||||
|
av_strlcpy(date, t->value, 5);
|
||||||
|
av_metadata_set2(m, "TYER", NULL, 0);
|
||||||
|
av_metadata_set2(m, "TYE", NULL, 0);
|
||||||
|
|
||||||
|
if (!(t = get_date_tag(*m, "TDAT")) &&
|
||||||
|
!(t = get_date_tag(*m, "TDA")))
|
||||||
|
goto finish;
|
||||||
|
snprintf(date + 4, sizeof(date) - 4, "-%.2s-%.2s", t->value + 2, t->value);
|
||||||
|
av_metadata_set2(m, "TDAT", NULL, 0);
|
||||||
|
av_metadata_set2(m, "TDA", NULL, 0);
|
||||||
|
|
||||||
|
if (!(t = get_date_tag(*m, "TIME")) &&
|
||||||
|
!(t = get_date_tag(*m, "TIM")))
|
||||||
|
goto finish;
|
||||||
|
snprintf(date + 10, sizeof(date) - 10, " %.2s:%.2s", t->value, t->value + 2);
|
||||||
|
av_metadata_set2(m, "TIME", NULL, 0);
|
||||||
|
av_metadata_set2(m, "TIM", NULL, 0);
|
||||||
|
|
||||||
|
finish:
|
||||||
|
if (date[0])
|
||||||
|
av_metadata_set2(m, "date", date, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void ff_id3v2_parse(AVFormatContext *s, int len, uint8_t version, uint8_t flags)
|
static void ff_id3v2_parse(AVFormatContext *s, int len, uint8_t version, uint8_t flags)
|
||||||
{
|
{
|
||||||
int isv34, unsync;
|
int isv34, unsync;
|
||||||
@ -172,7 +218,7 @@ static void ff_id3v2_parse(AVFormatContext *s, int len, uint8_t version, uint8_t
|
|||||||
unsync = flags & 0x80;
|
unsync = flags & 0x80;
|
||||||
|
|
||||||
if (isv34 && flags & 0x40) /* Extended header present, just skip over it */
|
if (isv34 && flags & 0x40) /* Extended header present, just skip over it */
|
||||||
avio_seek(s->pb, get_size(s->pb, 4), SEEK_CUR);
|
avio_skip(s->pb, get_size(s->pb, 4));
|
||||||
|
|
||||||
while (len >= taghdrlen) {
|
while (len >= taghdrlen) {
|
||||||
unsigned int tflags;
|
unsigned int tflags;
|
||||||
@ -208,7 +254,7 @@ static void ff_id3v2_parse(AVFormatContext *s, int len, uint8_t version, uint8_t
|
|||||||
|
|
||||||
if (tflags & (ID3v2_FLAG_ENCRYPTION | ID3v2_FLAG_COMPRESSION)) {
|
if (tflags & (ID3v2_FLAG_ENCRYPTION | ID3v2_FLAG_COMPRESSION)) {
|
||||||
av_log(s, AV_LOG_WARNING, "Skipping encrypted/compressed ID3v2 frame %s.\n", tag);
|
av_log(s, AV_LOG_WARNING, "Skipping encrypted/compressed ID3v2 frame %s.\n", tag);
|
||||||
avio_seek(s->pb, tlen, SEEK_CUR);
|
avio_skip(s->pb, tlen);
|
||||||
} else if (tag[0] == 'T') {
|
} else if (tag[0] == 'T') {
|
||||||
if (unsync || tunsync) {
|
if (unsync || tunsync) {
|
||||||
int i, j;
|
int i, j;
|
||||||
@ -229,7 +275,7 @@ static void ff_id3v2_parse(AVFormatContext *s, int len, uint8_t version, uint8_t
|
|||||||
else if (!tag[0]) {
|
else if (!tag[0]) {
|
||||||
if (tag[1])
|
if (tag[1])
|
||||||
av_log(s, AV_LOG_WARNING, "invalid frame id, assuming padding");
|
av_log(s, AV_LOG_WARNING, "invalid frame id, assuming padding");
|
||||||
avio_seek(s->pb, tlen, SEEK_CUR);
|
avio_skip(s->pb, tlen);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* Skip to end of tag */
|
/* Skip to end of tag */
|
||||||
@ -238,10 +284,10 @@ static void ff_id3v2_parse(AVFormatContext *s, int len, uint8_t version, uint8_t
|
|||||||
|
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
/* Skip padding */
|
/* Skip padding */
|
||||||
avio_seek(s->pb, len, SEEK_CUR);
|
avio_skip(s->pb, len);
|
||||||
}
|
}
|
||||||
if (version == 4 && flags & 0x10) /* Footer preset, always 10 bytes, skip over it */
|
if (version == 4 && flags & 0x10) /* Footer preset, always 10 bytes, skip over it */
|
||||||
avio_seek(s->pb, 10, SEEK_CUR);
|
avio_skip(s->pb, 10);
|
||||||
|
|
||||||
av_free(buffer);
|
av_free(buffer);
|
||||||
return;
|
return;
|
||||||
@ -280,6 +326,7 @@ void ff_id3v2_read(AVFormatContext *s, const char *magic)
|
|||||||
ff_metadata_conv(&s->metadata, NULL, ff_id3v2_34_metadata_conv);
|
ff_metadata_conv(&s->metadata, NULL, ff_id3v2_34_metadata_conv);
|
||||||
ff_metadata_conv(&s->metadata, NULL, ff_id3v2_2_metadata_conv);
|
ff_metadata_conv(&s->metadata, NULL, ff_id3v2_2_metadata_conv);
|
||||||
ff_metadata_conv(&s->metadata, NULL, ff_id3v2_4_metadata_conv);
|
ff_metadata_conv(&s->metadata, NULL, ff_id3v2_4_metadata_conv);
|
||||||
|
merge_date(&s->metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
const AVMetadataConv ff_id3v2_34_metadata_conv[] = {
|
const AVMetadataConv ff_id3v2_34_metadata_conv[] = {
|
||||||
|
@ -257,7 +257,7 @@ static int idcin_read_packet(AVFormatContext *s,
|
|||||||
|
|
||||||
chunk_size = avio_rl32(pb);
|
chunk_size = avio_rl32(pb);
|
||||||
/* skip the number of decoded bytes (always equal to width * height) */
|
/* skip the number of decoded bytes (always equal to width * height) */
|
||||||
avio_seek(pb, 4, SEEK_CUR);
|
avio_skip(pb, 4);
|
||||||
chunk_size -= 4;
|
chunk_size -= 4;
|
||||||
ret= av_get_packet(pb, pkt, chunk_size);
|
ret= av_get_packet(pb, pkt, chunk_size);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
@ -136,14 +136,14 @@ static int roq_read_packet(AVFormatContext *s,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* don't care about this chunk anymore */
|
/* don't care about this chunk anymore */
|
||||||
avio_seek(pb, RoQ_CHUNK_PREAMBLE_SIZE, SEEK_CUR);
|
avio_skip(pb, RoQ_CHUNK_PREAMBLE_SIZE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RoQ_QUAD_CODEBOOK:
|
case RoQ_QUAD_CODEBOOK:
|
||||||
/* packet needs to contain both this codebook and next VQ chunk */
|
/* packet needs to contain both this codebook and next VQ chunk */
|
||||||
codebook_offset = avio_tell(pb) - RoQ_CHUNK_PREAMBLE_SIZE;
|
codebook_offset = avio_tell(pb) - RoQ_CHUNK_PREAMBLE_SIZE;
|
||||||
codebook_size = chunk_size;
|
codebook_size = chunk_size;
|
||||||
avio_seek(pb, codebook_size, SEEK_CUR);
|
avio_skip(pb, codebook_size);
|
||||||
if (avio_read(pb, preamble, RoQ_CHUNK_PREAMBLE_SIZE) !=
|
if (avio_read(pb, preamble, RoQ_CHUNK_PREAMBLE_SIZE) !=
|
||||||
RoQ_CHUNK_PREAMBLE_SIZE)
|
RoQ_CHUNK_PREAMBLE_SIZE)
|
||||||
return AVERROR(EIO);
|
return AVERROR(EIO);
|
||||||
|
@ -30,7 +30,7 @@ static int roq_write_header(struct AVFormatContext *s)
|
|||||||
};
|
};
|
||||||
|
|
||||||
avio_write(s->pb, header, 8);
|
avio_write(s->pb, header, 8);
|
||||||
put_flush_packet(s->pb);
|
avio_flush(s->pb);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -134,7 +134,7 @@ static int iff_read_header(AVFormatContext *s,
|
|||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
st->codec->channels = 1;
|
st->codec->channels = 1;
|
||||||
avio_seek(pb, 8, SEEK_CUR);
|
avio_skip(pb, 8);
|
||||||
// codec_tag used by ByteRun1 decoder to distinguish progressive (PBM) and interlaced (ILBM) content
|
// codec_tag used by ByteRun1 decoder to distinguish progressive (PBM) and interlaced (ILBM) content
|
||||||
st->codec->codec_tag = avio_rl32(pb);
|
st->codec->codec_tag = avio_rl32(pb);
|
||||||
|
|
||||||
@ -152,10 +152,10 @@ static int iff_read_header(AVFormatContext *s,
|
|||||||
|
|
||||||
if (data_size < 14)
|
if (data_size < 14)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
avio_seek(pb, 12, SEEK_CUR);
|
avio_skip(pb, 12);
|
||||||
st->codec->sample_rate = avio_rb16(pb);
|
st->codec->sample_rate = avio_rb16(pb);
|
||||||
if (data_size >= 16) {
|
if (data_size >= 16) {
|
||||||
avio_seek(pb, 1, SEEK_CUR);
|
avio_skip(pb, 1);
|
||||||
compression = avio_r8(pb);
|
compression = avio_r8(pb);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -186,14 +186,14 @@ static int iff_read_header(AVFormatContext *s,
|
|||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
st->codec->width = avio_rb16(pb);
|
st->codec->width = avio_rb16(pb);
|
||||||
st->codec->height = avio_rb16(pb);
|
st->codec->height = avio_rb16(pb);
|
||||||
avio_seek(pb, 4, SEEK_CUR); // x, y offset
|
avio_skip(pb, 4); // x, y offset
|
||||||
st->codec->bits_per_coded_sample = avio_r8(pb);
|
st->codec->bits_per_coded_sample = avio_r8(pb);
|
||||||
if (data_size >= 11) {
|
if (data_size >= 11) {
|
||||||
avio_seek(pb, 1, SEEK_CUR); // masking
|
avio_skip(pb, 1); // masking
|
||||||
compression = avio_r8(pb);
|
compression = avio_r8(pb);
|
||||||
}
|
}
|
||||||
if (data_size >= 16) {
|
if (data_size >= 16) {
|
||||||
avio_seek(pb, 3, SEEK_CUR); // paddding, transparent
|
avio_skip(pb, 3); // paddding, transparent
|
||||||
st->sample_aspect_ratio.num = avio_r8(pb);
|
st->sample_aspect_ratio.num = avio_r8(pb);
|
||||||
st->sample_aspect_ratio.den = avio_r8(pb);
|
st->sample_aspect_ratio.den = avio_r8(pb);
|
||||||
}
|
}
|
||||||
@ -223,7 +223,7 @@ static int iff_read_header(AVFormatContext *s,
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
avio_seek(pb, data_size - (avio_tell(pb) - orig_pos) + (data_size & 1), SEEK_CUR);
|
avio_skip(pb, data_size - (avio_tell(pb) - orig_pos) + (data_size & 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
avio_seek(pb, iff->body_pos, SEEK_SET);
|
avio_seek(pb, iff->body_pos, SEEK_SET);
|
||||||
|
@ -372,8 +372,8 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
avio_write(pb[0], pkt->data , ysize);
|
avio_write(pb[0], pkt->data , ysize);
|
||||||
avio_write(pb[1], pkt->data + ysize, (pkt->size - ysize)/2);
|
avio_write(pb[1], pkt->data + ysize, (pkt->size - ysize)/2);
|
||||||
avio_write(pb[2], pkt->data + ysize +(pkt->size - ysize)/2, (pkt->size - ysize)/2);
|
avio_write(pb[2], pkt->data + ysize +(pkt->size - ysize)/2, (pkt->size - ysize)/2);
|
||||||
put_flush_packet(pb[1]);
|
avio_flush(pb[1]);
|
||||||
put_flush_packet(pb[2]);
|
avio_flush(pb[2]);
|
||||||
avio_close(pb[1]);
|
avio_close(pb[1]);
|
||||||
avio_close(pb[2]);
|
avio_close(pb[2]);
|
||||||
}else{
|
}else{
|
||||||
@ -402,7 +402,7 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
}
|
}
|
||||||
avio_write(pb[0], pkt->data, pkt->size);
|
avio_write(pb[0], pkt->data, pkt->size);
|
||||||
}
|
}
|
||||||
put_flush_packet(pb[0]);
|
avio_flush(pb[0]);
|
||||||
if (!img->is_pipe) {
|
if (!img->is_pipe) {
|
||||||
avio_close(pb[0]);
|
avio_close(pb[0]);
|
||||||
}
|
}
|
||||||
|
@ -35,11 +35,11 @@ static int ingenient_read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
w = avio_rl16(s->pb);
|
w = avio_rl16(s->pb);
|
||||||
h = avio_rl16(s->pb);
|
h = avio_rl16(s->pb);
|
||||||
|
|
||||||
avio_seek(s->pb, 8, SEEK_CUR); // zero + size (padded?)
|
avio_skip(s->pb, 8); // zero + size (padded?)
|
||||||
avio_seek(s->pb, 2, SEEK_CUR);
|
avio_skip(s->pb, 2);
|
||||||
unk1 = avio_rl16(s->pb);
|
unk1 = avio_rl16(s->pb);
|
||||||
unk2 = avio_rl16(s->pb);
|
unk2 = avio_rl16(s->pb);
|
||||||
avio_seek(s->pb, 22, SEEK_CUR); // ASCII timestamp
|
avio_skip(s->pb, 22); // ASCII timestamp
|
||||||
|
|
||||||
av_log(s, AV_LOG_DEBUG, "Ingenient packet: size=%d, width=%d, height=%d, unk1=%d unk2=%d\n",
|
av_log(s, AV_LOG_DEBUG, "Ingenient packet: size=%d, width=%d, height=%d, unk1=%d unk2=%d\n",
|
||||||
size, w, h, unk1, unk2);
|
size, w, h, unk1, unk2);
|
||||||
|
@ -239,4 +239,15 @@ AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base,
|
|||||||
*/
|
*/
|
||||||
void ff_reduce_index(AVFormatContext *s, int stream_index);
|
void ff_reduce_index(AVFormatContext *s, int stream_index);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert a relative url into an absolute url, given a base url.
|
||||||
|
*
|
||||||
|
* @param buf the buffer where output absolute url is written
|
||||||
|
* @param size the size of buf
|
||||||
|
* @param base the base url, may be equal to buf.
|
||||||
|
* @param rel the new url, which is interpreted relative to base
|
||||||
|
*/
|
||||||
|
void ff_make_absolute_url(char *buf, int size, const char *base,
|
||||||
|
const char *rel);
|
||||||
|
|
||||||
#endif /* AVFORMAT_INTERNAL_H */
|
#endif /* AVFORMAT_INTERNAL_H */
|
||||||
|
@ -299,12 +299,12 @@ static int process_ipmovie_chunk(IPMVEContext *s, AVIOContext *pb,
|
|||||||
|
|
||||||
case OPCODE_END_OF_STREAM:
|
case OPCODE_END_OF_STREAM:
|
||||||
debug_ipmovie("end of stream\n");
|
debug_ipmovie("end of stream\n");
|
||||||
avio_seek(pb, opcode_size, SEEK_CUR);
|
avio_skip(pb, opcode_size);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_END_OF_CHUNK:
|
case OPCODE_END_OF_CHUNK:
|
||||||
debug_ipmovie("end of chunk\n");
|
debug_ipmovie("end of chunk\n");
|
||||||
avio_seek(pb, opcode_size, SEEK_CUR);
|
avio_skip(pb, opcode_size);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_CREATE_TIMER:
|
case OPCODE_CREATE_TIMER:
|
||||||
@ -359,7 +359,7 @@ static int process_ipmovie_chunk(IPMVEContext *s, AVIOContext *pb,
|
|||||||
|
|
||||||
case OPCODE_START_STOP_AUDIO:
|
case OPCODE_START_STOP_AUDIO:
|
||||||
debug_ipmovie("start/stop audio\n");
|
debug_ipmovie("start/stop audio\n");
|
||||||
avio_seek(pb, opcode_size, SEEK_CUR);
|
avio_skip(pb, opcode_size);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_INIT_VIDEO_BUFFERS:
|
case OPCODE_INIT_VIDEO_BUFFERS:
|
||||||
@ -393,12 +393,12 @@ static int process_ipmovie_chunk(IPMVEContext *s, AVIOContext *pb,
|
|||||||
case OPCODE_UNKNOWN_14:
|
case OPCODE_UNKNOWN_14:
|
||||||
case OPCODE_UNKNOWN_15:
|
case OPCODE_UNKNOWN_15:
|
||||||
debug_ipmovie("unknown (but documented) opcode %02X\n", opcode_type);
|
debug_ipmovie("unknown (but documented) opcode %02X\n", opcode_type);
|
||||||
avio_seek(pb, opcode_size, SEEK_CUR);
|
avio_skip(pb, opcode_size);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_SEND_BUFFER:
|
case OPCODE_SEND_BUFFER:
|
||||||
debug_ipmovie("send buffer\n");
|
debug_ipmovie("send buffer\n");
|
||||||
avio_seek(pb, opcode_size, SEEK_CUR);
|
avio_skip(pb, opcode_size);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_AUDIO_FRAME:
|
case OPCODE_AUDIO_FRAME:
|
||||||
@ -407,22 +407,22 @@ static int process_ipmovie_chunk(IPMVEContext *s, AVIOContext *pb,
|
|||||||
/* log position and move on for now */
|
/* log position and move on for now */
|
||||||
s->audio_chunk_offset = avio_tell(pb);
|
s->audio_chunk_offset = avio_tell(pb);
|
||||||
s->audio_chunk_size = opcode_size;
|
s->audio_chunk_size = opcode_size;
|
||||||
avio_seek(pb, opcode_size, SEEK_CUR);
|
avio_skip(pb, opcode_size);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_SILENCE_FRAME:
|
case OPCODE_SILENCE_FRAME:
|
||||||
debug_ipmovie("silence frame\n");
|
debug_ipmovie("silence frame\n");
|
||||||
avio_seek(pb, opcode_size, SEEK_CUR);
|
avio_skip(pb, opcode_size);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_INIT_VIDEO_MODE:
|
case OPCODE_INIT_VIDEO_MODE:
|
||||||
debug_ipmovie("initialize video mode\n");
|
debug_ipmovie("initialize video mode\n");
|
||||||
avio_seek(pb, opcode_size, SEEK_CUR);
|
avio_skip(pb, opcode_size);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_CREATE_GRADIENT:
|
case OPCODE_CREATE_GRADIENT:
|
||||||
debug_ipmovie("create gradient\n");
|
debug_ipmovie("create gradient\n");
|
||||||
avio_seek(pb, opcode_size, SEEK_CUR);
|
avio_skip(pb, opcode_size);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_SET_PALETTE:
|
case OPCODE_SET_PALETTE:
|
||||||
@ -464,7 +464,7 @@ static int process_ipmovie_chunk(IPMVEContext *s, AVIOContext *pb,
|
|||||||
|
|
||||||
case OPCODE_SET_PALETTE_COMPRESSED:
|
case OPCODE_SET_PALETTE_COMPRESSED:
|
||||||
debug_ipmovie("set palette compressed\n");
|
debug_ipmovie("set palette compressed\n");
|
||||||
avio_seek(pb, opcode_size, SEEK_CUR);
|
avio_skip(pb, opcode_size);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_SET_DECODING_MAP:
|
case OPCODE_SET_DECODING_MAP:
|
||||||
@ -473,7 +473,7 @@ static int process_ipmovie_chunk(IPMVEContext *s, AVIOContext *pb,
|
|||||||
/* log position and move on for now */
|
/* log position and move on for now */
|
||||||
s->decode_map_chunk_offset = avio_tell(pb);
|
s->decode_map_chunk_offset = avio_tell(pb);
|
||||||
s->decode_map_chunk_size = opcode_size;
|
s->decode_map_chunk_size = opcode_size;
|
||||||
avio_seek(pb, opcode_size, SEEK_CUR);
|
avio_skip(pb, opcode_size);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_VIDEO_DATA:
|
case OPCODE_VIDEO_DATA:
|
||||||
@ -482,7 +482,7 @@ static int process_ipmovie_chunk(IPMVEContext *s, AVIOContext *pb,
|
|||||||
/* log position and move on for now */
|
/* log position and move on for now */
|
||||||
s->video_chunk_offset = avio_tell(pb);
|
s->video_chunk_offset = avio_tell(pb);
|
||||||
s->video_chunk_size = opcode_size;
|
s->video_chunk_size = opcode_size;
|
||||||
avio_seek(pb, opcode_size, SEEK_CUR);
|
avio_skip(pb, opcode_size);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user