mirror of
https://github.com/mpv-player/mpv.git
synced 2024-09-20 12:02:23 +02:00
TOOLS: remove useless crap
Most of the scripts in TOOLS seem entirely useless. Remove them. There were about 3 types of scripts: - apparent developer tools (like file format dumpers, benchmarks) => I doubt any mplayer developer still alive even uses these - helpers for encoding or ripping stuff => mencoder is gone, at least from this version of mplayer - helpers meant for users (launching mplayer in weird ways, etc.) => just no, it will cause you more pain than gain So no, there is nothing useful. Under the scripts not deleted, these are needed for building mplayer: file2string.py matroska.py vdpau_functions.py These might have _some_ use (but still questionable): binary_codecs.sh checktree.sh
This commit is contained in:
parent
7d4576cf79
commit
6dc1249625
477
TOOLS/README
477
TOOLS/README
@ -1,477 +0,0 @@
|
|||||||
README for the TOOLS directory
|
|
||||||
==============================
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
--------
|
|
||||||
|
|
||||||
In this directory you can find some nice scripts and code that makes
|
|
||||||
using MPlayer easier.
|
|
||||||
|
|
||||||
FIXME: Document the following tools:
|
|
||||||
|
|
||||||
bmovl-test
|
|
||||||
|
|
||||||
|
|
||||||
MPlayer scripts in the TOOLS dir
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
edgedetect.fp, emboss.fp
|
|
||||||
|
|
||||||
Author: Reimar Döffinger
|
|
||||||
|
|
||||||
Description: Examples of custom fragment program for OpenGL video out driver
|
|
||||||
|
|
||||||
Usage: mplayer -vo gl:yuv=4:customprog=edgedetect.fp
|
|
||||||
|
|
||||||
|
|
||||||
midentify.sh
|
|
||||||
|
|
||||||
Author: Tobias Diedrich
|
|
||||||
|
|
||||||
Description: Runs 'mplayer -identify' for all arguments while preventing
|
|
||||||
video window flashing.
|
|
||||||
|
|
||||||
Usage: midentify.sh file1 [file2 ...]
|
|
||||||
|
|
||||||
|
|
||||||
mpconsole.sh
|
|
||||||
|
|
||||||
Author: Rich Felker
|
|
||||||
|
|
||||||
Description: Script to run MPlayer on the console (fbdev/mga_vid/etc.) without
|
|
||||||
the console text and/or flashing cursor getting in the way.
|
|
||||||
|
|
||||||
Usage: mpconsole.sh [mplayer options]
|
|
||||||
|
|
||||||
|
|
||||||
mplmult.sh
|
|
||||||
|
|
||||||
Author: Reimar Döffinger
|
|
||||||
|
|
||||||
Description: Example how to output video on multiple windows in sync. Might
|
|
||||||
be even more useful in combination with -vo ggi to distribute
|
|
||||||
the video arbitrarily.
|
|
||||||
|
|
||||||
Usage: mplmult.sh <n> <options>
|
|
||||||
n Number of MPlayer instances that display the video.
|
|
||||||
options Any options you would pass to MPlayer, more than
|
|
||||||
one file will usually not work.
|
|
||||||
|
|
||||||
|
|
||||||
subsearch.sh
|
|
||||||
|
|
||||||
Author: Alex Beregszaszi
|
|
||||||
|
|
||||||
Description: Collects subtitle files from the directory given as argument
|
|
||||||
('.' if none is given) and its subdirectories and prints
|
|
||||||
them as a comma separated list to stdout.
|
|
||||||
|
|
||||||
Usage: subsearch.sh [directory]
|
|
||||||
mplayer -sub `subsearch.sh` movie
|
|
||||||
|
|
||||||
|
|
||||||
wma2ogg.pl
|
|
||||||
|
|
||||||
Author: Peter Simon
|
|
||||||
|
|
||||||
Description: Converts WMA files to Ogg or MP3.
|
|
||||||
|
|
||||||
Usage: wma2ogg [options] <-f FILE1 | -f FILE2 ... | -a>
|
|
||||||
-f, -file filename
|
|
||||||
-a converts all WMA files in the current directory
|
|
||||||
-t output filetype (ogg, mp3) [default=ogg]
|
|
||||||
-lame I wanna use L.A.M.E. sure enough!
|
|
||||||
-br bitrate (kb/s) [default=from the WMA]
|
|
||||||
-del remove WMA file(s) after the transcoding
|
|
||||||
|
|
||||||
|
|
||||||
Tech scripts in the TOOLS dir
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
calcbpp.pl
|
|
||||||
|
|
||||||
Author: Moritz Bunkus
|
|
||||||
|
|
||||||
Description: A script that calculates the $bpp for a movie, mentioned in
|
|
||||||
DOCS/tech/encoding-tips.txt, see that document for more info.
|
|
||||||
|
|
||||||
Usage: calcbpp.pl <resolution> <aspect ratio> <bitrate> <fps>
|
|
||||||
resolution: the cropped but unscaled resolution
|
|
||||||
(use '-vf cropdetect')
|
|
||||||
aspect ratio: the encoded aspect ratio. All DVDs come at
|
|
||||||
720x576 but contain a flag that tells the player
|
|
||||||
wether it should display the DVD at an aspect
|
|
||||||
ratio of 4/3 (1.333) or at 16/9 (1.777). Have a
|
|
||||||
look at MPlayer's output - there's something
|
|
||||||
about 'prescaling'. That's what you are looking
|
|
||||||
for.
|
|
||||||
bitrate: the video bitrate in kbit/s
|
|
||||||
fps: the fps
|
|
||||||
|
|
||||||
example: calcbpp.pl 720x440 16/9 896 25
|
|
||||||
|
|
||||||
|
|
||||||
countquant.pl
|
|
||||||
|
|
||||||
Author: Moritz Bunkus
|
|
||||||
|
|
||||||
Description: Counts the quantizers used for the encoding, mentioned in
|
|
||||||
DOCS/tech/encoding-tips.txt, see that document for more info.
|
|
||||||
|
|
||||||
Usage: countquant.pl < divx2pass.log
|
|
||||||
It will print out which quantizer was used how often. If you see
|
|
||||||
that e.g. the lowest quantizer (vqmin=2) gets used for > 95% of
|
|
||||||
the frames then you can safely increase your picture size.
|
|
||||||
|
|
||||||
|
|
||||||
plotpsnr.pl
|
|
||||||
|
|
||||||
Author: Jonas Jermann
|
|
||||||
|
|
||||||
Description: Draw PSNR log graphs using gnuplot.
|
|
||||||
|
|
||||||
Usage: plotpsnr.pl [options] <file>
|
|
||||||
-h, --help Display this help message
|
|
||||||
-quant Display quantizers
|
|
||||||
-size Display size
|
|
||||||
-psnr Display PSNR
|
|
||||||
-iframes Display I-frames
|
|
||||||
-pframes Display P-frames
|
|
||||||
-bframes Display B-frames
|
|
||||||
-aframes Display all frames in different colors
|
|
||||||
-cmp <file2> Compare two files
|
|
||||||
-qs <style> Quantizer style
|
|
||||||
-ss <style> Size style
|
|
||||||
-ps <style> PSNR style
|
|
||||||
|
|
||||||
Default: -quant -size -psnr -qs "p" -ss "i" -ps "p"
|
|
||||||
|
|
||||||
Note: Requires gnuplot. Comparison is based on file2. Comparison
|
|
||||||
assumes that the frame numbers of both files fit.
|
|
||||||
|
|
||||||
|
|
||||||
psnr-video.sh
|
|
||||||
|
|
||||||
Author: Matthias Wieser
|
|
||||||
|
|
||||||
Description: Calculates the PSNR between two existing video files.
|
|
||||||
The PSNR is calculated frame by frame.
|
|
||||||
Also prints the overall PSNR.
|
|
||||||
The script can be used to:
|
|
||||||
* Compare different softwarescalers (should I use
|
|
||||||
-sws 1 or -sws 2 ?)
|
|
||||||
* Compare different resolutions (is it better to scale
|
|
||||||
down to 640x360 or to 560x320)
|
|
||||||
* Compare different deinterlacers
|
|
||||||
* Compare different video codecs
|
|
||||||
* Compare video filters (is it better to use -vf hqdn3d
|
|
||||||
or lavcopts:nr=400)
|
|
||||||
* [...]
|
|
||||||
|
|
||||||
Usage: psnr-video.sh <file1> <file2> [<frames>] [<options1>] [<options2>]
|
|
||||||
|
|
||||||
<file1> and <file2> are the video files for which the PSNR
|
|
||||||
should be calculated.
|
|
||||||
[<frames>] is the number of frames to process, starting
|
|
||||||
from frame 1.
|
|
||||||
[<options1>] are additional MPlayer options for <file1>
|
|
||||||
[<options2>] are additional MPlayer options for <file2>
|
|
||||||
|
|
||||||
A file called ./psnr.dat will be created with the following
|
|
||||||
content:
|
|
||||||
|
|
||||||
File;Y;Cb;Cr
|
|
||||||
00000001.ppm;34.23;39.54;40.06;35.426
|
|
||||||
00000002.ppm;33.03;38.71;39.26;34.271
|
|
||||||
00000003.ppm;33.45;38.91;39.28;34.655
|
|
||||||
00000004.ppm;32.72;38.69;38.85;33.972
|
|
||||||
[...]
|
|
||||||
00000247.ppm;35.55;40.84;42.15;36.785
|
|
||||||
PSNR:;35.9887
|
|
||||||
|
|
||||||
Note: This script relies on the the tool "pnmpsnr" for the
|
|
||||||
frame-by-frame PSNR calculation.
|
|
||||||
Be aware that psnr-video.sh needs a lot of temporary space
|
|
||||||
in /tmp/.
|
|
||||||
|
|
||||||
|
|
||||||
asfinfo
|
|
||||||
|
|
||||||
Author: Arpi
|
|
||||||
|
|
||||||
Description: a simple ASF header display program
|
|
||||||
|
|
||||||
Usage: asfinfo <filename.asf>
|
|
||||||
|
|
||||||
Note: Also see MPlayer's -identify option.
|
|
||||||
|
|
||||||
|
|
||||||
avi-fix
|
|
||||||
|
|
||||||
Author: Arpi
|
|
||||||
|
|
||||||
Description: A simple tool to fix chunk sizes in RIFF AVI files.
|
|
||||||
|
|
||||||
Usage: avi-fix [-fix] <badfile.avi>
|
|
||||||
|
|
||||||
Note: It does not check or fix the index. You can try to fix it with
|
|
||||||
ffmpeg -i ... -acodec copy -vcodec copy.
|
|
||||||
|
|
||||||
|
|
||||||
checktree.sh
|
|
||||||
|
|
||||||
Author: Ivo van Poorten
|
|
||||||
|
|
||||||
Description: Check the source tree for anomalies.
|
|
||||||
|
|
||||||
Usage: checktree.sh -help
|
|
||||||
|
|
||||||
Note: This script is meant for developers to check the current
|
|
||||||
source tree and/or the patches they are working on.
|
|
||||||
|
|
||||||
|
|
||||||
mphelp_check.py
|
|
||||||
|
|
||||||
Author: Uoti Urpala
|
|
||||||
|
|
||||||
Description: Check console message translations for common errors.
|
|
||||||
|
|
||||||
Usage: mphelp_check.py [--missing] <master file> <files to check>
|
|
||||||
|
|
||||||
Note: Compares MPlayer translation files against a master file and
|
|
||||||
reports conflicting arguments, extra strings not present in
|
|
||||||
the base file and (optionally) missing strings.
|
|
||||||
|
|
||||||
|
|
||||||
cpuinfo
|
|
||||||
|
|
||||||
Author: Jürgen Keil
|
|
||||||
|
|
||||||
Description: the prototype ../cpuinfo.c
|
|
||||||
|
|
||||||
Note: Used by configure to emulate /proc/cpuinfo on non-Linux systems.
|
|
||||||
|
|
||||||
|
|
||||||
dump_mp4
|
|
||||||
|
|
||||||
Author: Arpi
|
|
||||||
|
|
||||||
Description: MPEG4-ES stream inspector, dumps the stream startcodes.
|
|
||||||
|
|
||||||
|
|
||||||
fastmemcpybench
|
|
||||||
|
|
||||||
Author: Felix Bünemann
|
|
||||||
|
|
||||||
Description: benchmark/testbed for fastmemcpy stuff
|
|
||||||
|
|
||||||
Note: Also see fastmem.sh.
|
|
||||||
|
|
||||||
|
|
||||||
movinfo
|
|
||||||
|
|
||||||
Author: Arpi
|
|
||||||
|
|
||||||
Description: Show QuickTime MOV file structure.
|
|
||||||
|
|
||||||
Usage: movinfo <filename.mov>
|
|
||||||
|
|
||||||
|
|
||||||
vivodump
|
|
||||||
|
|
||||||
Author: Arpi
|
|
||||||
|
|
||||||
Description: Dump H.263 frame headers from VIVO files.
|
|
||||||
|
|
||||||
Usage: vivodump <input_file> <output_file>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Miscellaneous scripts in the TOOLS dir
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
subedit.pl
|
|
||||||
|
|
||||||
Author: Michael Klepikov
|
|
||||||
|
|
||||||
Description: A script for pipelined editing of subtitle files.
|
|
||||||
|
|
||||||
Usage: subedit.pl [switches]
|
|
||||||
-if,--input-format <fmt> input format; supported: SRT (default: SRT)
|
|
||||||
-of,--output-format <fmt> output format; supported: SRT
|
|
||||||
(default: input format)
|
|
||||||
-s,--shift <time> shift all subtitles by <time>
|
|
||||||
(format: [-]hh:mm:ss,fraction)
|
|
||||||
-c,--scale <time> scale by adding <time> to overall duration
|
|
||||||
-f,--split-from <time> drop subtitles that end before <time>
|
|
||||||
-t,--split-to <time> drop subtitles that start after <time> (will
|
|
||||||
truncate timing if it overlaps a boundary)
|
|
||||||
-r,--renumber renumber SRT subtitles in output
|
|
||||||
-d,--debug enable debug output
|
|
||||||
-h,--help help message
|
|
||||||
|
|
||||||
|
|
||||||
w32codec_dl.pl
|
|
||||||
|
|
||||||
Author: Tom Lees
|
|
||||||
|
|
||||||
Description: This script will use the Windows Media Player codec download
|
|
||||||
infrastructure to aquire the codecs listed in codecs.conf and put
|
|
||||||
them in a directory named "codecs/" below the current directory.
|
|
||||||
|
|
||||||
Usage: w32codec_dl.pl <codecs.conf location>
|
|
||||||
|
|
||||||
Note: You will need the libwww-perl stuff and the cabextract utility
|
|
||||||
which can be found at http://www.kyz.uklinux.net/cabextract.php3.
|
|
||||||
|
|
||||||
|
|
||||||
binary_codecs.sh
|
|
||||||
|
|
||||||
Author: Andrea Menucci, thuglife
|
|
||||||
|
|
||||||
Description: Downloads binary codecs from mplayerhq.hu and installs them
|
|
||||||
on a Debian system.
|
|
||||||
|
|
||||||
Usage: binary_codecs.sh install
|
|
||||||
binary_codecs.sh uninstall
|
|
||||||
|
|
||||||
|
|
||||||
vobshift.py
|
|
||||||
|
|
||||||
Author: Gábor Farkas
|
|
||||||
|
|
||||||
Description: Adjust the time-info in vobsub files
|
|
||||||
|
|
||||||
Usage: vobshift.py in.idx out.idx +8.3
|
|
||||||
Will shift the time by 8.3 seconds
|
|
||||||
|
|
||||||
|
|
||||||
subrip.c
|
|
||||||
|
|
||||||
Author: Kim Minh Kaplan
|
|
||||||
|
|
||||||
Description: Transform VOBsub subtitles into Subrip text subtitles using
|
|
||||||
GOCR/JOCR.
|
|
||||||
|
|
||||||
Usage: subrip <vobsub basename> [subid [output filename] ]
|
|
||||||
|
|
||||||
Note: Requires at least JOCR/GOCR 0.37.
|
|
||||||
You will have to change the 'vobsub_id' value if you want a
|
|
||||||
subtitle different from number 0. Hint: You can view the
|
|
||||||
subtitle that is being decoded with "display subtitle-*.pgm".
|
|
||||||
|
|
||||||
|
|
||||||
alaw-gen.c
|
|
||||||
|
|
||||||
Author: Arpi
|
|
||||||
|
|
||||||
Description: Generates alaw/ulaw tables.
|
|
||||||
|
|
||||||
Note: Created to work around a past license issue, no longer useful.
|
|
||||||
|
|
||||||
|
|
||||||
avisubdump.c
|
|
||||||
|
|
||||||
Author: Tobias Diedrich
|
|
||||||
|
|
||||||
Description: Dumps vobsub soft subtitles streams embedded in AVI files.
|
|
||||||
|
|
||||||
Usage: avisubdump <movie.avi>
|
|
||||||
|
|
||||||
|
|
||||||
vfw2menc.c
|
|
||||||
|
|
||||||
Author: Gianluigi Tiesi
|
|
||||||
|
|
||||||
Description: Creates a codec settings file from the Video for Windows codecs
|
|
||||||
found in the mplayer codec packs.
|
|
||||||
|
|
||||||
Usage: vfw2menc -f <fourcc> -d <codec.dll> -s <settingsfile.mcf>
|
|
||||||
-h|--help - displays this help
|
|
||||||
-d|--driver filename - dll or drv to load
|
|
||||||
-f|--fourcc fourcc - fourcc of selected driver
|
|
||||||
-s|--save filename - save settings to file
|
|
||||||
-c|--check filename - load and show setting in filename
|
|
||||||
-v|--view - displays the config dialog and do nothing
|
|
||||||
|
|
||||||
Notes: Works on Windows/Linux x86 only.
|
|
||||||
|
|
||||||
|
|
||||||
modify_reg.c
|
|
||||||
|
|
||||||
Author: Alan Nisota
|
|
||||||
|
|
||||||
Description: Modifies registry file (usually ~/.mplayer/registry)
|
|
||||||
|
|
||||||
Usage: modify_reg -r <registry_file> -l
|
|
||||||
modify_reg -r <registry_file> -k <key> [-d|-v <value>[-t <type>]]
|
|
||||||
-r|--registry - path to registry file
|
|
||||||
-l|--list - shows all keys and values
|
|
||||||
-k|--key - registry key
|
|
||||||
-d|--del - delete key
|
|
||||||
-v|--value - new value for key
|
|
||||||
-t|--type - key type: string (default) or dword
|
|
||||||
|
|
||||||
Notes: Necessary to use CoreAVC with MPlayer
|
|
||||||
|
|
||||||
|
|
||||||
compare.c
|
|
||||||
|
|
||||||
Author: Michael Niedermayer
|
|
||||||
|
|
||||||
Description: Simple file compare program that detects the number of rounding
|
|
||||||
errors and dies if the error is too large.
|
|
||||||
|
|
||||||
Usage: compare <file1> <file2>
|
|
||||||
|
|
||||||
|
|
||||||
realcodecs/
|
|
||||||
|
|
||||||
Author: miscellaneous
|
|
||||||
|
|
||||||
Description: Wrappers for Linux Real binary codecs used to analyze, alter and
|
|
||||||
dump the data flow between RealPlayer and its codecs.
|
|
||||||
|
|
||||||
Usage: - Set the path to the RealPlayer codecs directory in the C files.
|
|
||||||
- Run 'make realcodecs'.
|
|
||||||
- Rename the original codecs to match the names expected in the
|
|
||||||
wrapper sources. The default is to give them a "real" prefix,
|
|
||||||
e.g. realcook.so.6.0.
|
|
||||||
- Put the wrappers in the RealPlayer codecs directory.
|
|
||||||
|
|
||||||
Notes: Known to work at least on Linux x86 with RealPlayer8.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
netstream - access remote streams
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
netstream allows you to access most MPlayer stream types from a remote host.
|
|
||||||
The main purpose of this feature is to make it possible to directly use the
|
|
||||||
CD or DVD drive of another computer on the network (provided you have the
|
|
||||||
required bandwidth). On the downside some stream types (currently TV and MF)
|
|
||||||
are not usable remotely because they are implemented at the demuxer level.
|
|
||||||
|
|
||||||
Be aware that currently the server is not secure at all.
|
|
||||||
|
|
||||||
Compile the server by running 'make TOOLS/netstream' ('make TOOLS/netstream.exe'
|
|
||||||
on windows) from the root of mplayer source and then copy the netstream binary
|
|
||||||
to the right place on your system (usually /usr/local/bin on Unix). Start the
|
|
||||||
netstream server on the computer you intend to access remotely. There are no
|
|
||||||
command line arguments.
|
|
||||||
|
|
||||||
Play the second track of a VCD on the server with:
|
|
||||||
|
|
||||||
mplayer -cache 5000 mpst://servername/vcd://2
|
|
||||||
|
|
||||||
Access files on this server with:
|
|
||||||
|
|
||||||
mplayer -cache 5000 mpst://servername//usr/local/movies/lol.avi
|
|
||||||
|
|
||||||
Note that paths which do not start with a / will be interpreted as relative to
|
|
||||||
the directory where the server is running. The '-cache' option is not needed
|
|
||||||
but highly recommended.
|
|
||||||
|
|
||||||
netstream will not take -dvd-device, so you must either symlink
|
|
||||||
your drive to /dev/dvd/ or use the dvd:///path/to/dvd.
|
|
||||||
for example: mpst://audioserver/dvd:////dev/optical/lg_black_dvd
|
|
@ -1,68 +0,0 @@
|
|||||||
/*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
// sox -t raw -A -r 8000 -b alaw.alaw -t sw alaw.out
|
|
||||||
|
|
||||||
int main(void){
|
|
||||||
int i;
|
|
||||||
FILE *f;
|
|
||||||
|
|
||||||
f=fopen("alaw.dat","wb");
|
|
||||||
for(i=0;i<256;i++) fwrite(&i,1,1,f);
|
|
||||||
fclose(f);
|
|
||||||
|
|
||||||
system("sox -t raw -A -r 8000 -b alaw.dat -t sw alaw.out");
|
|
||||||
|
|
||||||
printf("// Generated by TOOLS/alaw-gen.c\n\n");
|
|
||||||
|
|
||||||
printf("#ifndef MPLAYER_ALAW_H\n");
|
|
||||||
printf("#define MPLAYER_ALAW_H\n");
|
|
||||||
|
|
||||||
printf("\nconst short alaw2short[]={\n");
|
|
||||||
|
|
||||||
f=fopen("alaw.out","rb");
|
|
||||||
for(i=0;i<256;i++){
|
|
||||||
signed short x;
|
|
||||||
fread(&x,2,1,f);
|
|
||||||
printf("%7d",x);
|
|
||||||
if(i!=255) putchar(',');
|
|
||||||
if((i&7)==7) printf("\n");
|
|
||||||
}
|
|
||||||
fclose(f);
|
|
||||||
printf("};\n");
|
|
||||||
|
|
||||||
system("sox -t raw -U -r 8000 -b alaw.dat -t sw alaw.out");
|
|
||||||
|
|
||||||
printf("\nconst short ulaw2short[]={\n");
|
|
||||||
|
|
||||||
f=fopen("alaw.out","rb");
|
|
||||||
for(i=0;i<256;i++){
|
|
||||||
signed short x;
|
|
||||||
fread(&x,2,1,f);
|
|
||||||
printf("%7d",x);
|
|
||||||
if(i!=255) putchar(',');
|
|
||||||
if((i&7)==7) printf("\n");
|
|
||||||
}
|
|
||||||
fclose(f);
|
|
||||||
printf("};\n\n");
|
|
||||||
|
|
||||||
printf("#endif /* MPLAYER_ALAW_H */\n");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
289
TOOLS/asfinfo.c
289
TOOLS/asfinfo.c
@ -1,289 +0,0 @@
|
|||||||
/*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SAVE_STREAMS
|
|
||||||
|
|
||||||
// simple ASF header display program by A'rpi/ESP-team
|
|
||||||
// .asf fileformat docs from http://divx.euro.ru
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
typedef struct __attribute__((packed))
|
|
||||||
{
|
|
||||||
long biSize; // sizeof(BITMAPINFOHEADER)
|
|
||||||
long biWidth;
|
|
||||||
long biHeight;
|
|
||||||
short biPlanes; // unused
|
|
||||||
short biBitCount;
|
|
||||||
long biCompression; // fourcc of image
|
|
||||||
long biSizeImage; // size of image. For uncompressed images
|
|
||||||
// ( biCompression 0 or 3 ) can be zero.
|
|
||||||
|
|
||||||
|
|
||||||
long biXPelsPerMeter; // unused
|
|
||||||
long biYPelsPerMeter; // unused
|
|
||||||
long biClrUsed; // valid only for palettized images.
|
|
||||||
// Number of colors in palette.
|
|
||||||
long biClrImportant;
|
|
||||||
} BITMAPINFOHEADER;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
short wFormatTag; // value that identifies compression format
|
|
||||||
short nChannels;
|
|
||||||
long nSamplesPerSec;
|
|
||||||
long nAvgBytesPerSec;
|
|
||||||
short nBlockAlign; // size of a data sample
|
|
||||||
short wBitsPerSample;
|
|
||||||
short cbSize; // size of format-specific data
|
|
||||||
} WAVEFORMATEX;
|
|
||||||
|
|
||||||
typedef struct __attribute__((packed)) {
|
|
||||||
unsigned char guid[16];
|
|
||||||
unsigned long long size;
|
|
||||||
} ASF_obj_header_t;
|
|
||||||
|
|
||||||
typedef struct __attribute__((packed)) {
|
|
||||||
ASF_obj_header_t objh;
|
|
||||||
unsigned int cno; // number of subchunks
|
|
||||||
unsigned char v1; // unknown (0x01)
|
|
||||||
unsigned char v2; // unknown (0x02)
|
|
||||||
} ASF_header_t;
|
|
||||||
|
|
||||||
typedef struct __attribute__((packed)) {
|
|
||||||
unsigned char client[16]; // Client GUID
|
|
||||||
unsigned long long file_size;
|
|
||||||
unsigned long long creat_time; //File creation time FILETIME 8
|
|
||||||
unsigned long long packets; //Number of packets UINT64 8
|
|
||||||
unsigned long long end_timestamp; //Timestamp of the end position UINT64 8
|
|
||||||
unsigned long long duration; //Duration of the playback UINT64 8
|
|
||||||
unsigned long start_timestamp; //Timestamp of the start position UINT32 4
|
|
||||||
unsigned long unk1; //Unknown, maybe reserved ( usually contains 0 ) UINT32 4
|
|
||||||
unsigned long flags; //Unknown, maybe flags ( usually contains 2 ) UINT32 4
|
|
||||||
unsigned long packetsize; //Size of packet, in bytes UINT32 4
|
|
||||||
unsigned long packetsize2; //Size of packet ( confirm ) UINT32 4
|
|
||||||
unsigned long frame_size; //Size of uncompressed video frame UINT32 4
|
|
||||||
} ASF_file_header_t;
|
|
||||||
|
|
||||||
typedef struct __attribute__((packed)) {
|
|
||||||
unsigned char type[16]; // Stream type (audio/video) GUID 16
|
|
||||||
unsigned char concealment[16]; // Audio error concealment type GUID 16
|
|
||||||
unsigned long long unk1; // Unknown, maybe reserved ( usually contains 0 ) UINT64 8
|
|
||||||
unsigned long type_size; //Total size of type-specific data UINT32 4
|
|
||||||
unsigned long stream_size; //Size of stream-specific data UINT32 4
|
|
||||||
unsigned short stream_no; //Stream number UINT16 2
|
|
||||||
unsigned long unk2; //Unknown UINT32 4
|
|
||||||
} ASF_stream_header_t;
|
|
||||||
|
|
||||||
typedef struct __attribute__((packed)) {
|
|
||||||
unsigned char streamno;
|
|
||||||
unsigned char seq;
|
|
||||||
unsigned long x;
|
|
||||||
unsigned char flag;
|
|
||||||
} ASF_segmhdr_t;
|
|
||||||
|
|
||||||
|
|
||||||
ASF_header_t asfh;
|
|
||||||
ASF_obj_header_t objh;
|
|
||||||
ASF_file_header_t fileh;
|
|
||||||
ASF_stream_header_t streamh;
|
|
||||||
unsigned char buffer[8192];
|
|
||||||
|
|
||||||
int i;
|
|
||||||
|
|
||||||
static char* chunk_type(unsigned char* guid){
|
|
||||||
switch(*((unsigned int*)guid)){
|
|
||||||
case 0xF8699E40: return "guid_audio_stream";
|
|
||||||
case 0xBC19EFC0: return "guid_video_stream";
|
|
||||||
case 0x49f1a440: return "guid_audio_conceal_none";
|
|
||||||
case 0xbfc3cd50: return "guid_audio_conceal_interleave";
|
|
||||||
case 0x75B22630: return "guid_header";
|
|
||||||
case 0x75b22636: return "guid_data_chunk";
|
|
||||||
case 0x33000890: return "guid_index_chunk";
|
|
||||||
case 0xB7DC0791: return "guid_stream_header";
|
|
||||||
case 0xD6E229D1: return "guid_header_2_0";
|
|
||||||
case 0x8CABDCA1: return "guid_file_header";
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void print_wave_header(WAVEFORMATEX *h){
|
|
||||||
printf("======= WAVE Format =======\n");
|
|
||||||
|
|
||||||
printf("Format Tag: %d (0x%X)\n", h->wFormatTag, h->wFormatTag);
|
|
||||||
printf("Channels: %d\n", h->nChannels);
|
|
||||||
printf("Samplerate: %ld\n", h->nSamplesPerSec);
|
|
||||||
printf("avg byte/sec: %ld\n", h->nAvgBytesPerSec);
|
|
||||||
printf("Block align: %d\n", h->nBlockAlign);
|
|
||||||
printf("bits/sample: %d\n", h->wBitsPerSample);
|
|
||||||
printf("cbSize: %d\n", h->cbSize);
|
|
||||||
|
|
||||||
switch(h->wFormatTag){
|
|
||||||
case 0x01: printf("Audio in PCM format\n"); break;
|
|
||||||
case 0x50: printf("Audio in MPEG Layer 1/2 format\n"); break;
|
|
||||||
case 0x55: printf("Audio in MPEG Layer-3 format\n"); break; // ACM
|
|
||||||
case 0x02: printf("Audio in MS ADPCM format\n"); break; // ACM
|
|
||||||
case 0x11: printf("Audio in IMA ADPCM format\n"); break; // ACM
|
|
||||||
case 0x31:
|
|
||||||
case 0x32: printf("Audio in MS GSM 6.10 format\n"); break; // ACM
|
|
||||||
case 0x160:
|
|
||||||
case 0x161: printf("Audio in DivX WMA format\n"); break; // ACM
|
|
||||||
default: printf("Audio in UNKNOWN (id=0x%X) format\n", h->wFormatTag);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("===========================\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void print_video_header(BITMAPINFOHEADER *h){
|
|
||||||
printf("======= VIDEO Format ======\n");
|
|
||||||
printf(" biSize %ld\n", h->biSize);
|
|
||||||
printf(" biWidth %ld\n", h->biWidth);
|
|
||||||
printf(" biHeight %ld\n", h->biHeight);
|
|
||||||
printf(" biPlanes %d\n", h->biPlanes);
|
|
||||||
printf(" biBitCount %d\n", h->biBitCount);
|
|
||||||
printf(" biCompression %ld='%.4s'\n", h->biCompression, (const char*)&h->biCompression);
|
|
||||||
printf(" biSizeImage %ld\n", h->biSizeImage);
|
|
||||||
printf("===========================\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
FILE* streams[128];
|
|
||||||
|
|
||||||
int main(int argc, char* argv[]){
|
|
||||||
FILE *f = fopen(argc > 1 ? argv[1] : "Alice Deejay - Back In My Life.asf", "rb");
|
|
||||||
|
|
||||||
if(!f){
|
|
||||||
printf("file not found\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
//printf("sizeof=%d\n", sizeof(objh));
|
|
||||||
//printf("sizeof=%d\n", sizeof(asfh));
|
|
||||||
|
|
||||||
fread(&asfh, sizeof(asfh), 1, f); // header obj
|
|
||||||
//for(i = 0; i < 16; i++)
|
|
||||||
// printf("%02X ", asfh.objh.guid[i]);
|
|
||||||
printf("[%s] %d (subchunks: %d)\n", chunk_type(asfh.objh.guid),
|
|
||||||
(int) asfh.objh.size, asfh.cno);
|
|
||||||
|
|
||||||
while(fread(&objh, sizeof(objh), 1, f) > 0){
|
|
||||||
int pos = ftell(f);
|
|
||||||
//for(i = 0; i < 16; i++)
|
|
||||||
// printf("%02X ", objh.guid[i]);
|
|
||||||
printf("0x%08X [%s] %d\n", pos-sizeof(objh), chunk_type(objh.guid),
|
|
||||||
(int) objh.size);
|
|
||||||
switch(*((unsigned int*)&objh.guid)){
|
|
||||||
case 0xB7DC0791: // guid_stream_header
|
|
||||||
fread(&streamh, sizeof(streamh), 1, f);
|
|
||||||
printf("stream type: %s\n", chunk_type(streamh.type));
|
|
||||||
printf("stream concealment: %s\n", chunk_type(streamh.concealment));
|
|
||||||
printf("type: %d bytes, stream: %d bytes ID: %d\n",
|
|
||||||
(int)streamh.type_size, (int)streamh.stream_size,
|
|
||||||
(int)streamh.stream_no);
|
|
||||||
printf("FILEPOS=0x%lX\n", ftell(f));
|
|
||||||
// type-specific data:
|
|
||||||
fread(buffer,streamh.type_size,1,f);
|
|
||||||
switch(*((unsigned int*)&streamh.type)){
|
|
||||||
case 0xF8699E40: // guid_audio_stream
|
|
||||||
print_wave_header((WAVEFORMATEX*)buffer);
|
|
||||||
break;
|
|
||||||
case 0xBC19EFC0: // guid_video_stream
|
|
||||||
print_video_header((BITMAPINFOHEADER*)&buffer[4 + 4 + 1 + 2]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// stream-specific data:
|
|
||||||
fread(buffer, streamh.stream_size, 1, f);
|
|
||||||
break;
|
|
||||||
//case 0xD6E229D1:
|
|
||||||
// return "guid_header_2_0";
|
|
||||||
case 0x8CABDCA1: // guid_file_header
|
|
||||||
fread(&fileh, sizeof(fileh), 1, f);
|
|
||||||
printf("packets: %d flags: %d pack_size: %d frame_size: %d\n",
|
|
||||||
(int)fileh.packets, (int)fileh.flags, (int)fileh.packetsize,
|
|
||||||
(int)fileh.frame_size);
|
|
||||||
break;
|
|
||||||
case 0x75b22636: // guid_data_chunk
|
|
||||||
{ int endp = pos + objh.size - sizeof(objh);
|
|
||||||
unsigned char* packet = malloc((int)fileh.packetsize);
|
|
||||||
int fpos;
|
|
||||||
fseek(f, 26, SEEK_CUR);
|
|
||||||
while((fpos = ftell(f)) < endp){
|
|
||||||
fread(packet, (int)fileh.packetsize, 1, f);
|
|
||||||
if(packet[0] == 0x82){
|
|
||||||
unsigned char flags = packet[3];
|
|
||||||
unsigned char* p = &packet[5];
|
|
||||||
unsigned long time;
|
|
||||||
unsigned short duration;
|
|
||||||
int segs = 1;
|
|
||||||
int seg;
|
|
||||||
int padding=0;
|
|
||||||
if(flags & 8){
|
|
||||||
padding = p[0];
|
|
||||||
++p;
|
|
||||||
} else
|
|
||||||
if(flags & 16){
|
|
||||||
padding = p[0] | (p[1] << 8);
|
|
||||||
p += 2;
|
|
||||||
}
|
|
||||||
time = *((unsigned long*)p);
|
|
||||||
p += 4;
|
|
||||||
duration = *((unsigned short*)p);
|
|
||||||
p += 2;
|
|
||||||
if(flags & 1){
|
|
||||||
segs = p[0] - 0x80;
|
|
||||||
++p;
|
|
||||||
}
|
|
||||||
printf("%08X: flag=%02X segs=%d pad=%d time=%ld dur=%d\n",
|
|
||||||
fpos, flags, segs, padding, time, duration);
|
|
||||||
for(seg = 0; seg < segs; seg++){
|
|
||||||
ASF_segmhdr_t* sh = (ASF_segmhdr_t*)p;
|
|
||||||
int len = 0;
|
|
||||||
p += sizeof(ASF_segmhdr_t);
|
|
||||||
if(sh->flag & 8) p+=8;// else
|
|
||||||
if(sh->flag & 1) ++p;
|
|
||||||
if(flags & 1){
|
|
||||||
len = *((unsigned short*)p);
|
|
||||||
p += 2;
|
|
||||||
}
|
|
||||||
printf(" seg #%d: streamno=%d seq=%d flag=%02X len=%d\n",
|
|
||||||
seg, sh->streamno&0x7F, sh->seq, sh->flag, len);
|
|
||||||
#ifdef SAVE_STREAMS
|
|
||||||
if(!streams[sh->streamno & 0x7F]){
|
|
||||||
char name[256];
|
|
||||||
snprintf(name, 256, "stream%02X.dat", sh->streamno & 0x7F);
|
|
||||||
streams[sh->streamno & 0x7F] = fopen(name, "wb");
|
|
||||||
}
|
|
||||||
fwrite(p, len, 1, streams[sh->streamno & 0x7F]);
|
|
||||||
#endif
|
|
||||||
p += len;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
printf("%08X: UNKNOWN %02X %02X %02X %02X %02X...\n", fpos,
|
|
||||||
packet[0], packet[1], packet[2], packet[3], packet[4]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
//case 0x33000890:
|
|
||||||
// return "guid_index_chunk";
|
|
||||||
|
|
||||||
}
|
|
||||||
fseek(f, pos + objh.size - sizeof(objh), SEEK_SET);
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(f);
|
|
||||||
return 0;
|
|
||||||
}
|
|
158
TOOLS/avi-fix.c
158
TOOLS/avi-fix.c
@ -1,158 +0,0 @@
|
|||||||
/* avi-fix v0.1 (C) A'rpi
|
|
||||||
* simple tool to fix chunk sizes in a RIFF AVI file
|
|
||||||
* it doesn't check/fix index. You can try to fix it with ffmpeg -i ... -acodec
|
|
||||||
* copy -vcodec copy
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#ifdef MP_DEBUG
|
|
||||||
#define mp_debug(...) printf(__VA_ARGS__)
|
|
||||||
#else
|
|
||||||
#define mp_debug(...)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#define FCC(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
|
|
||||||
|
|
||||||
static inline char xx(unsigned char c){
|
|
||||||
if(c>=32 && c<128) return c;
|
|
||||||
return '?';
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned int getid(FILE* f){
|
|
||||||
unsigned int id;
|
|
||||||
id=fgetc(f);
|
|
||||||
id=(id<<8)|fgetc(f);
|
|
||||||
id=(id<<8)|fgetc(f);
|
|
||||||
id=(id<<8)|fgetc(f);
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc,char* argv[]){
|
|
||||||
//FILE* f=fopen("edgar.avi","rb"); // readonly (report errors)
|
|
||||||
//FILE* f=fopen("edgar.avi","rb+"); // fix mode (fix chunk sizes)
|
|
||||||
unsigned int lastgood=0;
|
|
||||||
unsigned int fixat=0;
|
|
||||||
unsigned int offset=0;
|
|
||||||
int fix_flag=0;
|
|
||||||
FILE* f;
|
|
||||||
|
|
||||||
if(argc<=1){
|
|
||||||
printf("Usage: %s [-fix] badfile.avi\n",argv[0]);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!strcmp(argv[1],"-fix")){
|
|
||||||
fix_flag=1;
|
|
||||||
f=fopen(argv[argc-1],"rb+");
|
|
||||||
} else
|
|
||||||
f=fopen(argv[argc-1],"rb");
|
|
||||||
|
|
||||||
if(!f){
|
|
||||||
perror("error");
|
|
||||||
printf("couldnt open '%s'\n",argv[argc-1]);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
while(1){
|
|
||||||
unsigned int id,len;
|
|
||||||
again:
|
|
||||||
id=fgetc(f);
|
|
||||||
id=(id<<8)|fgetc(f);
|
|
||||||
id=(id<<8)|fgetc(f);
|
|
||||||
faszom:
|
|
||||||
if(feof(f)) break;
|
|
||||||
// if(!lastgood && feof(f)) break;
|
|
||||||
id=(id<<8)|fgetc(f);
|
|
||||||
// lastgood=ftell(f);
|
|
||||||
mp_debug("%08X: %c%c%c%c\n",(int)ftell(f)-4,xx(id>>24),xx(id>>16),xx(id>>8),xx(id));
|
|
||||||
switch(id){
|
|
||||||
case FCC('R','I','F','F'):
|
|
||||||
fread(&len,4,1,f); // filesize
|
|
||||||
id=getid(f); // AVI
|
|
||||||
mp_debug("RIFF header, filesize=0x%X format=%c%c%c%c\n",len,xx(id>>24),xx(id>>16),xx(id>>8),xx(id));
|
|
||||||
break;
|
|
||||||
case FCC('L','I','S','T'):
|
|
||||||
fread(&len,4,1,f); // size
|
|
||||||
id=getid(f); // AVI
|
|
||||||
mp_debug("LIST size=0x%X format=%c%c%c%c\n",len,xx(id>>24),xx(id>>16),xx(id>>8),xx(id));
|
|
||||||
//case FCC('h','d','r','l'):
|
|
||||||
//case FCC('s','t','r','l'):
|
|
||||||
//case FCC('o','d','m','l'):
|
|
||||||
//case FCC('m','o','v','i'):
|
|
||||||
break;
|
|
||||||
// legal chunk IDs:
|
|
||||||
case FCC('a','v','i','h'): // avi header
|
|
||||||
case FCC('s','t','r','h'): // stream header
|
|
||||||
case FCC('s','t','r','f'): // stream format
|
|
||||||
case FCC('J','U','N','K'): // official shit
|
|
||||||
// index:
|
|
||||||
case FCC('i','d','x','1'): // main index??
|
|
||||||
case FCC('d','m','l','h'): // opendml header
|
|
||||||
case FCC('i','n','d','x'): // opendml main index??
|
|
||||||
case FCC('i','x','0','0'): // opendml sub index??
|
|
||||||
case FCC('i','x','0','1'): // opendml sub index??
|
|
||||||
// data:
|
|
||||||
case FCC('0','1','w','b'): // audio track #1
|
|
||||||
case FCC('0','2','w','b'): // audio track #2
|
|
||||||
case FCC('0','3','w','b'): // audio track #3
|
|
||||||
case FCC('0','0','d','b'): // uncompressed video
|
|
||||||
case FCC('0','0','d','c'): // compressed video
|
|
||||||
case FCC('0','0','_','_'): // A-V interleaved (type2 DV file)
|
|
||||||
// info:
|
|
||||||
case FCC('I','S','F','T'): // INFO: software
|
|
||||||
case FCC('I','S','R','C'): // INFO: source
|
|
||||||
case FCC('I','N','A','M'): // INFO: name
|
|
||||||
case FCC('I','S','B','J'): // INFO: subject
|
|
||||||
case FCC('I','A','R','T'): // INFO: artist
|
|
||||||
case FCC('I','C','O','P'): // INFO: copyright
|
|
||||||
case FCC('I','C','M','T'): // INFO: comment
|
|
||||||
lastgood=ftell(f);
|
|
||||||
if(fixat && fix_flag){
|
|
||||||
// fix last chunk's size field:
|
|
||||||
fseek(f,fixat,SEEK_SET);
|
|
||||||
len=lastgood-fixat-8;
|
|
||||||
mp_debug("Correct len to 0x%X\n",len);
|
|
||||||
fwrite(&len,4,1,f);
|
|
||||||
fseek(f,lastgood,SEEK_SET);
|
|
||||||
fixat=0;
|
|
||||||
}
|
|
||||||
fread(&len,4,1,f); // size
|
|
||||||
mp_debug("ID ok, chunk len=0x%X\n",len);
|
|
||||||
len+=len&1; // align at 2
|
|
||||||
fseek(f,len,SEEK_CUR); // skip data
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if(!lastgood){
|
|
||||||
++offset;
|
|
||||||
mp_debug("invalid ID, trying %d byte offset\n",offset);
|
|
||||||
goto faszom; // try again @ next post
|
|
||||||
}
|
|
||||||
mp_debug("invalid ID, parsing next chunk's data at 0x%X\n",lastgood);
|
|
||||||
fseek(f,lastgood,SEEK_SET);
|
|
||||||
fixat=lastgood;
|
|
||||||
lastgood=0;
|
|
||||||
goto again;
|
|
||||||
}
|
|
||||||
offset=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,200 +0,0 @@
|
|||||||
/*
|
|
||||||
* avisubdump
|
|
||||||
*
|
|
||||||
* avi vobsub subtitle stream dumper (c) 2004 Tobias Diedrich
|
|
||||||
*
|
|
||||||
* The subtitles are dumped to stdout.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#define FCC(a,b,c,d) (((a))|((b)<<8)|((c)<<16)|((d)<<24))
|
|
||||||
|
|
||||||
#define FCC_RIFF FCC('R','I','F','F')
|
|
||||||
#define FCC_LIST FCC('L','I','S','T')
|
|
||||||
#define FCC_strh FCC('s','t','r','h')
|
|
||||||
#define FCC_txts FCC('t','x','t','s')
|
|
||||||
#define FCC_GAB2 FCC('G','A','B','2')
|
|
||||||
|
|
||||||
#define GAB_LANGUAGE 0
|
|
||||||
#define GAB_ENTRY 1
|
|
||||||
#define GAB_LANGUAGE_UNICODE 2
|
|
||||||
#define GAB_ENTRY_UNICODE 3
|
|
||||||
#define GAB_RAWTEXTSUBTITLE 4
|
|
||||||
|
|
||||||
static unsigned int getle16(FILE* f){
|
|
||||||
unsigned int res;
|
|
||||||
|
|
||||||
res = fgetc(f);
|
|
||||||
res |= fgetc(f) << 8;
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int getle(FILE* f){
|
|
||||||
unsigned int res;
|
|
||||||
|
|
||||||
res = fgetc(f);
|
|
||||||
res |= fgetc(f) << 8;
|
|
||||||
res |= fgetc(f) << 16;
|
|
||||||
res |= fgetc(f) << 24;
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void skip(FILE *f, int len)
|
|
||||||
{
|
|
||||||
if (f != stdin) {
|
|
||||||
fseek(f,len,SEEK_CUR);
|
|
||||||
} else {
|
|
||||||
void *buf = malloc(len);
|
|
||||||
fread(buf,len,1,f);
|
|
||||||
free(buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int stream_id(unsigned int id)
|
|
||||||
{
|
|
||||||
char c1,c2;
|
|
||||||
c1 = (char)(id & 0xff);
|
|
||||||
c2 = (char)((id >> 8) & 0xff);
|
|
||||||
if (c1 >= '0' && c1 <= '9' &&
|
|
||||||
c2 >= '0' && c2 <= '9') {
|
|
||||||
c1 -= '0';
|
|
||||||
c2 -= '0';
|
|
||||||
return c1*10+c2;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dumpsub_gab2(FILE *f, int size) {
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
while (ret + 6 <= size) {
|
|
||||||
unsigned int len, id;
|
|
||||||
char *buf;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
id = getle16(f); ret += 2;
|
|
||||||
len = getle(f); ret += 4;
|
|
||||||
if (ret + len > size) break;
|
|
||||||
|
|
||||||
buf = malloc(len);
|
|
||||||
ret += fread(buf, 1, len, f);
|
|
||||||
|
|
||||||
switch (id) {
|
|
||||||
case GAB_LANGUAGE_UNICODE: /* FIXME: convert to utf-8; endianness */
|
|
||||||
for (i=0; i<len; i++) buf[i] = buf[i*2];
|
|
||||||
case GAB_LANGUAGE:
|
|
||||||
fprintf(stderr, "LANGUAGE: %s\n", buf);
|
|
||||||
break;
|
|
||||||
case GAB_ENTRY_UNICODE: /* FIXME: convert to utf-8; endianness */
|
|
||||||
for (i=0; i<len; i++) buf[i] = buf[i*2];
|
|
||||||
case GAB_ENTRY:
|
|
||||||
fprintf(stderr, "ENTRY: %s\n", buf);
|
|
||||||
break;
|
|
||||||
case GAB_RAWTEXTSUBTITLE:
|
|
||||||
printf("%s", buf);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "Unknown type %d, len %d\n", id, len);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
free(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dump(FILE *f) {
|
|
||||||
unsigned int id, len;
|
|
||||||
int stream = 0;
|
|
||||||
int substream = -2;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
id = getle(f);
|
|
||||||
len = getle(f);
|
|
||||||
|
|
||||||
if(feof(f)) break;
|
|
||||||
|
|
||||||
if (id == FCC_RIFF ||
|
|
||||||
id == FCC_LIST) {
|
|
||||||
getle(f);
|
|
||||||
continue;
|
|
||||||
} else if (id == FCC_strh) {
|
|
||||||
id = getle(f); len -= 4;
|
|
||||||
fprintf(stderr, "Stream %d is %c%c%c%c",
|
|
||||||
stream,
|
|
||||||
id,
|
|
||||||
id >> 8,
|
|
||||||
id >> 16,
|
|
||||||
id >> 24);
|
|
||||||
if (id == FCC_txts) {
|
|
||||||
substream = stream;
|
|
||||||
fprintf(stderr, " (subtitle stream)");
|
|
||||||
}
|
|
||||||
fprintf(stderr, ".\n");
|
|
||||||
stream++;
|
|
||||||
} else if (stream_id(id) == substream) {
|
|
||||||
unsigned int subid;
|
|
||||||
subid = getle(f); len -= 4;
|
|
||||||
if (subid != FCC_GAB2) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"Unknown subtitle chunk %c%c%c%c (%08x).\n",
|
|
||||||
id, id >> 8, id >> 16, id >> 24, subid);
|
|
||||||
} else {
|
|
||||||
skip(f,1); len -= 1;
|
|
||||||
len -= dumpsub_gab2(f, len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
len+=len&1;
|
|
||||||
skip(f,len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc,char* argv[])
|
|
||||||
{
|
|
||||||
FILE* f;
|
|
||||||
|
|
||||||
if (argc != 2) {
|
|
||||||
fprintf(stderr, "Usage: %s <avi>\n", argv[0]);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(argv[argc-1], "-") == 0) {
|
|
||||||
dump(stdin);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
f=fopen(argv[argc-1],"rb");
|
|
||||||
|
|
||||||
if (!f) {
|
|
||||||
fprintf(stderr, "Could not open '%s': %s\n",
|
|
||||||
argv[argc-1], strerror(errno));
|
|
||||||
exit(-errno);
|
|
||||||
}
|
|
||||||
|
|
||||||
dump(f);
|
|
||||||
fclose(f);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,136 +0,0 @@
|
|||||||
/* small program to test the features of vf_bmovl
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <SDL/SDL.h>
|
|
||||||
#include <SDL/SDL_image.h>
|
|
||||||
|
|
||||||
#define DEBUG 0
|
|
||||||
|
|
||||||
static void
|
|
||||||
blit(int fifo, unsigned char *bitmap, int width, int height,
|
|
||||||
int xpos, int ypos, int alpha, int clear)
|
|
||||||
{
|
|
||||||
char str[100];
|
|
||||||
int nbytes;
|
|
||||||
|
|
||||||
sprintf(str, "RGBA32 %d %d %d %d %d %d\n",
|
|
||||||
width, height, xpos, ypos, alpha, clear);
|
|
||||||
|
|
||||||
if(DEBUG) printf("Sending %s", str);
|
|
||||||
|
|
||||||
write(fifo, str, strlen(str));
|
|
||||||
nbytes = write(fifo, bitmap, width*height*4);
|
|
||||||
|
|
||||||
if(DEBUG) printf("Sent %d bytes of bitmap data...\n", nbytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
set_alpha(int fifo, int width, int height, int xpos, int ypos, int alpha) {
|
|
||||||
char str[100];
|
|
||||||
|
|
||||||
sprintf(str, "ALPHA %d %d %d %d %d\n",
|
|
||||||
width, height, xpos, ypos, alpha);
|
|
||||||
|
|
||||||
if(DEBUG) printf("Sending %s", str);
|
|
||||||
|
|
||||||
write(fifo, str, strlen(str));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
paint(unsigned char* bitmap, int size, int red, int green, int blue, int alpha) {
|
|
||||||
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for(i=0; i < size; i+=4) {
|
|
||||||
bitmap[i+0] = red;
|
|
||||||
bitmap[i+1] = green;
|
|
||||||
bitmap[i+2] = blue;
|
|
||||||
bitmap[i+3] = alpha;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
|
|
||||||
int fifo=-1;
|
|
||||||
int width=0, height=0;
|
|
||||||
unsigned char *bitmap;
|
|
||||||
SDL_Surface *image;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if(argc<3) {
|
|
||||||
printf("Usage: %s <bmovl fifo> <image file> <width> <height>\n", argv[0]);
|
|
||||||
printf("width and height are w/h of MPlayer's screen!\n");
|
|
||||||
exit(10);
|
|
||||||
}
|
|
||||||
|
|
||||||
width = atoi(argv[3]);
|
|
||||||
height = atoi(argv[4]);
|
|
||||||
|
|
||||||
fifo = open( argv[1], O_RDWR );
|
|
||||||
if(!fifo) {
|
|
||||||
fprintf(stderr, "Error opening FIFO %s!\n", argv[1]);
|
|
||||||
exit(10);
|
|
||||||
}
|
|
||||||
|
|
||||||
image = IMG_Load(argv[2]);
|
|
||||||
if(!image) {
|
|
||||||
fprintf(stderr, "Couldn't load image %s!\n", argv[2]);
|
|
||||||
exit(10);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("Loaded image %s: width=%d, height=%d\n", argv[2], image->w, image->h);
|
|
||||||
|
|
||||||
// Display and move image
|
|
||||||
for(i=0; (i < (width - image->w)) && (i < (height - image->h)); i += 5)
|
|
||||||
blit(fifo, image->pixels, image->w, image->h, i, i, 0, 1);
|
|
||||||
|
|
||||||
// Create a 75x75 bitmap
|
|
||||||
bitmap = malloc(75 * 75 * 4);
|
|
||||||
|
|
||||||
// Paint bitmap red, 50% transparent and blit at position 50,50
|
|
||||||
paint(bitmap, (75*75*4), 255, 0, 0, 128);
|
|
||||||
blit(fifo, bitmap, 75, 75, 50, 50, 0, 0);
|
|
||||||
|
|
||||||
// Paint bitmap green, 50% transparent and blit at position -50,50
|
|
||||||
paint(bitmap, (75*75*4), 0, 255, 0, 128);
|
|
||||||
blit(fifo, bitmap, 75, 75, width-50-75, 50, 0, 0);
|
|
||||||
|
|
||||||
// Paint bitmap blue, 50% transparent and blit at position -50,50
|
|
||||||
paint(bitmap, (75*75*4), 0, 0, 255, 128);
|
|
||||||
blit(fifo, bitmap, 75, 75, 50, height-50-75, 0, 0);
|
|
||||||
|
|
||||||
// Blit another image in the middle, completly transparent
|
|
||||||
blit(fifo, image->pixels, image->w, image->h,
|
|
||||||
(width/2)-(image->w/2), (height/2)-(image->h/2), -255, 0);
|
|
||||||
|
|
||||||
// Fade in image
|
|
||||||
for(i=-255; i <= 0; i++)
|
|
||||||
set_alpha(fifo, image->w, image->h,
|
|
||||||
(width/2)-(image->w/2), (height/2)-(image->h/2), i);
|
|
||||||
|
|
||||||
|
|
||||||
// Clean up
|
|
||||||
free(bitmap);
|
|
||||||
SDL_FreeSurface(image);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
#!/usr/bin/perl -w
|
|
||||||
|
|
||||||
use POSIX;
|
|
||||||
|
|
||||||
sub round {
|
|
||||||
my $v = shift;
|
|
||||||
|
|
||||||
return floor($v + 0.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
$raw_aspect = 720/576;
|
|
||||||
|
|
||||||
if (scalar(@ARGV) < 4) {
|
|
||||||
print("Please provide a) the cropped but unscaled resolution (e.g. " .
|
|
||||||
"716x524), b) the aspect ratio (either 4/3 or 16/9 for most DVDs), " .
|
|
||||||
"c) the video bitrate in kbps (e.g. 800) and d) the movie's fps.\n");
|
|
||||||
print("If your DVD is not encoded at 720x576 then change the \$raw_aspect" .
|
|
||||||
"variable at the beginning of this script.\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
($unscaled_width, $unscaled_height) = split('x', $ARGV[0]);
|
|
||||||
$encoded_at = $ARGV[1];
|
|
||||||
if ($encoded_at =~ /\//) {
|
|
||||||
my @a = split(/\//, $encoded_at);
|
|
||||||
$encoded_at = $a[0] / $a[1];
|
|
||||||
}
|
|
||||||
$scaled_width = $unscaled_width * ($encoded_at / ($raw_aspect));
|
|
||||||
$scaled_height = $unscaled_height;
|
|
||||||
$picture_ar = $scaled_width / $scaled_height;
|
|
||||||
($bps, $fps) = @ARGV[2, 3];
|
|
||||||
|
|
||||||
printf("Prescaled picture: %dx%d, AR %.2f\n", $scaled_width, $scaled_height,
|
|
||||||
$picture_ar);
|
|
||||||
for ($width = 720; $width >= 320; $width -= 16) {
|
|
||||||
$height = 16 * round($width / $picture_ar / 16);
|
|
||||||
$diff = round($width / $picture_ar - $height);
|
|
||||||
$new_ar = $width / $height;
|
|
||||||
$picture_ar_error = abs(100 - $picture_ar / $new_ar * 100);
|
|
||||||
printf("${width}x${height}, diff % 3d, new AR %.2f, AR error %.2f%% " .
|
|
||||||
"scale=%d:%d bpp: %.3f\n", $diff, $new_ar, $picture_ar_error, $width,
|
|
||||||
$height, ($bps * 1000) / ($width * $height * $fps));
|
|
||||||
}
|
|
@ -1,73 +0,0 @@
|
|||||||
/*
|
|
||||||
* Simple file compare program, it finds the number of rounding errors
|
|
||||||
* and dies if there is too large an error ( ABS(a-b)>1 ).
|
|
||||||
*
|
|
||||||
* copyright (c) 2001 Michael Niedermayer
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
// FIXME: No checks but it is just for debugging so who cares ;)
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
FILE *f0, *f1;
|
|
||||||
int dif=0;
|
|
||||||
|
|
||||||
if(argc!=3)
|
|
||||||
{
|
|
||||||
printf("compare <file1> <file2>\n");
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
f0= fopen(argv[1], "rb");
|
|
||||||
f1= fopen(argv[2], "rb");
|
|
||||||
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
short c0;
|
|
||||||
short c1;
|
|
||||||
int d;
|
|
||||||
|
|
||||||
int e0= fread(&c0, 2, 1, f0);
|
|
||||||
int e1= fread(&c1, 2, 1, f1);
|
|
||||||
|
|
||||||
d=c0-c1;
|
|
||||||
if(e0==0 && e1==0) break;
|
|
||||||
if(e0==0 || e1==0)
|
|
||||||
{
|
|
||||||
printf("FATAL error, files have different size!\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(d<0) d=-d; // ABS
|
|
||||||
if(d>1)
|
|
||||||
{
|
|
||||||
printf("FATAL error, too large a difference found (%d)!\n", d);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(d) dif++;
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(f0);
|
|
||||||
fclose(f1);
|
|
||||||
|
|
||||||
printf("%d (+/-1)differences found\n", dif);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
#!/usr/bin/perl -w
|
|
||||||
|
|
||||||
sub display_quants {
|
|
||||||
$frames = 0;
|
|
||||||
foreach $key (sort(keys(%quants))) {
|
|
||||||
$frames += $quants{$key};
|
|
||||||
}
|
|
||||||
foreach $key (sort({ $a <=> $b } keys(%quants))) {
|
|
||||||
printf("q=%d:\t% 6d, % 6.2f%%\n", $key, $quants{$key}, $quants{$key} *
|
|
||||||
100 / $frames);
|
|
||||||
}
|
|
||||||
print("$lines lines processed, $frames frames found\n");
|
|
||||||
printf("average quant. is: %f\n", $quant_total/$frames);
|
|
||||||
}
|
|
||||||
|
|
||||||
$lines = 0;
|
|
||||||
$thislines = 0;
|
|
||||||
$quant_total = 0;
|
|
||||||
|
|
||||||
while (<STDIN>) {
|
|
||||||
$lines++;
|
|
||||||
$thislines++;
|
|
||||||
if (/ q:([0-9]+) /) {
|
|
||||||
$quants{$1}++;
|
|
||||||
} elsif (/ q:(([0-9]+)\.[0-9]+) /) {
|
|
||||||
$quants{$2}++;
|
|
||||||
$quant_total += $1;
|
|
||||||
}
|
|
||||||
if ((scalar(@ARGV) > 0) && ($thislines > $ARGV[0])) {
|
|
||||||
display_quants();
|
|
||||||
$thislines = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
display_quants();
|
|
@ -1,63 +0,0 @@
|
|||||||
/*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main(void){
|
|
||||||
int c;
|
|
||||||
unsigned int head=-1;
|
|
||||||
int pos=-3;
|
|
||||||
|
|
||||||
while((c=getchar())>=0){
|
|
||||||
head<<=8;
|
|
||||||
if(head==0x100){
|
|
||||||
int startcode=head|c;
|
|
||||||
printf("%08X 1%02X ",pos,c);
|
|
||||||
if (startcode<=0x11F) printf("Video Object Start");
|
|
||||||
else if(startcode<=0x12F) printf("Video Object Layer Start");
|
|
||||||
else if(startcode<=0x13F) printf("Reserved");
|
|
||||||
else if(startcode<=0x15F) printf("FGS bp start");
|
|
||||||
else if(startcode<=0x1AF) printf("Reserved");
|
|
||||||
else if(startcode==0x1B0) printf("Visual Object Seq Start");
|
|
||||||
else if(startcode==0x1B1) printf("Visual Object Seq End");
|
|
||||||
else if(startcode==0x1B2) printf("User Data");
|
|
||||||
else if(startcode==0x1B3) printf("Group of VOP start");
|
|
||||||
else if(startcode==0x1B4) printf("Video Session Error");
|
|
||||||
else if(startcode==0x1B5) printf("Visual Object Start");
|
|
||||||
else if(startcode==0x1B6) printf("Video Object Plane start");
|
|
||||||
else if(startcode==0x1B7) printf("slice start");
|
|
||||||
else if(startcode==0x1B8) printf("extension start");
|
|
||||||
else if(startcode==0x1B9) printf("fgs start");
|
|
||||||
else if(startcode==0x1BA) printf("FBA Object start");
|
|
||||||
else if(startcode==0x1BB) printf("FBA Object Plane start");
|
|
||||||
else if(startcode==0x1BC) printf("Mesh Object start");
|
|
||||||
else if(startcode==0x1BD) printf("Mesh Object Plane start");
|
|
||||||
else if(startcode==0x1BE) printf("Still Textutre Object start");
|
|
||||||
else if(startcode==0x1BF) printf("Textutre Spatial Layer start");
|
|
||||||
else if(startcode==0x1C0) printf("Textutre SNR Layer start");
|
|
||||||
else if(startcode==0x1C1) printf("Textutre Tile start");
|
|
||||||
else if(startcode==0x1C2) printf("Textutre Shape Layer start");
|
|
||||||
else if(startcode==0x1C3) printf("stuffing start");
|
|
||||||
else if(startcode<=0x1C5) printf("reserved");
|
|
||||||
else if(startcode<=0x1FF) printf("System start");
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
head|=c;
|
|
||||||
++pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
!!ARBfp1.0
|
|
||||||
# Custom YUV->RGB conversion program for MPlayer's -vo gl.
|
|
||||||
# Copyleft (C) Reimar Döffinger, 2005
|
|
||||||
# Licensed under the GNU GPL v2 or later
|
|
||||||
# Usage: mplayer -vo gl:yuv=4:customprog=edgedetect.fp
|
|
||||||
# This is some custom edge-detect like effect.
|
|
||||||
# Try adjusting the gamma!
|
|
||||||
# program.env[0].xy contains the size of one source texel
|
|
||||||
TEMP res, yuv, pos, tmp, sizes;
|
|
||||||
SWZ sizes, program.env[0], x, y, 0, 0;
|
|
||||||
TEX yuv.r, fragment.texcoord[0], texture[0], 2D;
|
|
||||||
ADD pos, fragment.texcoord[0].xyxy, sizes.xwwy; # texels to the right and below
|
|
||||||
TEX tmp.r, pos.xyxy, texture[0], 2D;
|
|
||||||
MAD yuv.r, yuv.rrrr, {4}, -tmp.rrrr;
|
|
||||||
TEX tmp.r, pos.zwzw, texture[0], 2D;
|
|
||||||
SUB yuv.r, yuv.rrrr, tmp.rrrr;
|
|
||||||
SUB pos, fragment.texcoord[0].xyxy, sizes.xwwy; # texels to the left and above
|
|
||||||
TEX tmp.r, pos.xyxy, texture[0], 2D;
|
|
||||||
SUB yuv.r, yuv.rrrr, tmp.rrrr;
|
|
||||||
TEX tmp.r, pos.zwzw, texture[0], 2D;
|
|
||||||
SUB yuv.r, yuv.rrrr, tmp.rrrr;
|
|
||||||
TEX yuv.g, fragment.texcoord[1], texture[1], 2D;
|
|
||||||
TEX yuv.b, fragment.texcoord[2], texture[2], 2D;
|
|
||||||
# now do the normal YUV -> RGB conversion but include effect strength
|
|
||||||
# multiplication by 2 and 0.5 offset
|
|
||||||
MAD res, yuv.rrrr, {2.328, 2.328, 2.328, 0}, {-0.37416, 1.03133, -0.58599, 0.125};
|
|
||||||
MAD res.rgb, yuv.gggg, {0, -0.391, 2.018, 0}, res;
|
|
||||||
MAD res.rgb, yuv.bbbb, {1.596, -0.813, 0, 0}, res;
|
|
||||||
# do gamma texture lookup
|
|
||||||
TEX res.r, res.raaa, texture[3], 2D;
|
|
||||||
ADD res.a, res.a, 0.25;
|
|
||||||
TEX res.g, res.gaaa, texture[3], 2D;
|
|
||||||
ADD res.a, res.a, 0.25;
|
|
||||||
TEX res.b, res.baaa, texture[3], 2D;
|
|
||||||
# move res into result, this allows easily commenting out some parts.
|
|
||||||
MOV result.color, res;
|
|
||||||
END
|
|
@ -1,38 +0,0 @@
|
|||||||
!!ARBfp1.0
|
|
||||||
# Custom YUV->RGB conversion program for MPlayer's -vo gl.
|
|
||||||
# Copyleft (C) Reimar Döffinger, 2005
|
|
||||||
# Licensed under the GNU GPL v2 or later
|
|
||||||
# Usage: mplayer -vo gl:yuv=4:customprog=edgeenh.fp
|
|
||||||
# This is some custom edge-enhancement like effect.
|
|
||||||
# Try adjusting the gamma!
|
|
||||||
# program.env[0].xy contains the size of one source texel
|
|
||||||
PARAM strength = {0.5};
|
|
||||||
TEMP res, yuv, pos, tmp, sizes, center;
|
|
||||||
SWZ sizes, program.env[0], x, y, 0, 0;
|
|
||||||
TEX center.r, fragment.texcoord[0], texture[0], 2D;
|
|
||||||
ADD pos, fragment.texcoord[0].xyxy, sizes.xwwy; # texels to the right and below
|
|
||||||
TEX tmp.r, pos.xyxy, texture[0], 2D;
|
|
||||||
MAD yuv.r, center.rrrr, {4}, -tmp.rrrr;
|
|
||||||
TEX tmp.r, pos.zwzw, texture[0], 2D;
|
|
||||||
SUB yuv.r, yuv.rrrr, tmp.rrrr;
|
|
||||||
SUB pos, fragment.texcoord[0].xyxy, sizes.xwwy; # texels to the left and above
|
|
||||||
TEX tmp.r, pos.xyxy, texture[0], 2D;
|
|
||||||
SUB yuv.r, yuv.rrrr, tmp.rrrr;
|
|
||||||
TEX tmp.r, pos.zwzw, texture[0], 2D;
|
|
||||||
SUB yuv.r, yuv.rrrr, tmp.rrrr;
|
|
||||||
MAD yuv.r, yuv.rrrr, strength, center.rrrr;
|
|
||||||
TEX yuv.g, fragment.texcoord[1], texture[1], 2D;
|
|
||||||
TEX yuv.b, fragment.texcoord[2], texture[2], 2D;
|
|
||||||
# now do the normal YUV -> RGB conversion
|
|
||||||
MAD res, yuv.rrrr, {1.164, 1.164, 1.164, 0}, {-0.87416, 0.53133, -1.08599, 0.125};
|
|
||||||
MAD res.rgb, yuv.gggg, {0, -0.391, 2.018, 0}, res;
|
|
||||||
MAD res.rgb, yuv.bbbb, {1.596, -0.813, 0, 0}, res;
|
|
||||||
# do gamma texture lookup
|
|
||||||
TEX res.r, res.raaa, texture[3], 2D;
|
|
||||||
ADD res.a, res.a, 0.25;
|
|
||||||
TEX res.g, res.gaaa, texture[3], 2D;
|
|
||||||
ADD res.a, res.a, 0.25;
|
|
||||||
TEX res.b, res.baaa, texture[3], 2D;
|
|
||||||
# move res into result, this allows easily commenting out some parts.
|
|
||||||
MOV result.color, res;
|
|
||||||
END
|
|
@ -1,29 +0,0 @@
|
|||||||
!!ARBfp1.0
|
|
||||||
# Custom YUV->RGB conversion program for MPlayer's -vo gl.
|
|
||||||
# Copyleft (C) Reimar Döffinger, 2005
|
|
||||||
# Licensed under the GNU GPL v2 or later
|
|
||||||
# Usage: mplayer -vo gl:yuv=4:customprog=emboss.fp
|
|
||||||
# This is an emboss effect.
|
|
||||||
PARAM sizes = program.env[0];
|
|
||||||
TEMP res, yuv, pos, tmp;
|
|
||||||
TEX yuv.r, fragment.texcoord[0], texture[0], 2D;
|
|
||||||
MAD pos, sizes.xyxy, {-0.5, 0, 0, -0.8660}, fragment.texcoord[0].xyxy;
|
|
||||||
TEX tmp.r, pos.xyxy, texture[0], 2D;
|
|
||||||
MAD yuv.r, yuv.rrrr, {2}, -tmp.rrrr;
|
|
||||||
TEX tmp.r, pos.zwzw, texture[0], 2D;
|
|
||||||
SUB yuv.r, yuv.rrrr, tmp.rrrr;
|
|
||||||
TEX yuv.g, fragment.texcoord[1], texture[1], 2D;
|
|
||||||
TEX yuv.b, fragment.texcoord[2], texture[2], 2D;
|
|
||||||
# now do the normal YUV -> RGB conversion but with 0.5 offset
|
|
||||||
MAD res, yuv.rrrr, {1.164, 1.164, 1.164, 0}, {-0.37416, 1.03133, -0.58599, 0.125};
|
|
||||||
MAD res.rgb, yuv.gggg, {0, -0.391, 2.018, 0}, res;
|
|
||||||
MAD res.rgb, yuv.bbbb, {1.596, -0.813, 0, 0}, res;
|
|
||||||
# do gamma texture lookup
|
|
||||||
TEX res.r, res.raaa, texture[3], 2D;
|
|
||||||
ADD res.a, res.a, 0.25;
|
|
||||||
TEX res.g, res.gaaa, texture[3], 2D;
|
|
||||||
ADD res.a, res.a, 0.25;
|
|
||||||
TEX res.b, res.baaa, texture[3], 2D;
|
|
||||||
# move res into result, this allows easily commenting out some parts.
|
|
||||||
MOV result.color, res;
|
|
||||||
END
|
|
@ -1,241 +0,0 @@
|
|||||||
/*
|
|
||||||
* benchmark tool for fast_memcpy code from libvo
|
|
||||||
*
|
|
||||||
* NOTE: This code can not be used on Pentium MMX / II because they contain
|
|
||||||
* a bug in rdtsc. For Intel processors since P6(PII) rdpmc should be used
|
|
||||||
* instead. For PIII it's disputable and it seems the bug was fixed but this
|
|
||||||
* was not confirmed through testing.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include "cpudetect.h"
|
|
||||||
|
|
||||||
#define BLOCK_SIZE 4096
|
|
||||||
#define CONFUSION_FACTOR 0
|
|
||||||
|
|
||||||
#if HAVE_MMX
|
|
||||||
#define COMPILE_MMX
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_MMX2
|
|
||||||
#define COMPILE_MMX2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_AMD3DNOW
|
|
||||||
#define COMPILE_AMD3DNOW
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_SSE
|
|
||||||
#define COMPILE_SSE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef COMPILE_MMX
|
|
||||||
#undef RENAME
|
|
||||||
#undef HAVE_MMX
|
|
||||||
#undef HAVE_MMX2
|
|
||||||
#undef HAVE_AMD3DNOW
|
|
||||||
#undef HAVE_SSE
|
|
||||||
#undef HAVE_SSE2
|
|
||||||
#define HAVE_MMX 1
|
|
||||||
#define HAVE_MMX2 0
|
|
||||||
#define HAVE_AMD3DNOW 0
|
|
||||||
#define HAVE_SSE 0
|
|
||||||
#define HAVE_SSE2 0
|
|
||||||
#define RENAME(a) a ## _MMX
|
|
||||||
#include "libvo/aclib_template.c"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef COMPILE_MMX2
|
|
||||||
#undef RENAME
|
|
||||||
#undef HAVE_MMX
|
|
||||||
#undef HAVE_MMX2
|
|
||||||
#undef HAVE_AMD3DNOW
|
|
||||||
#undef HAVE_SSE
|
|
||||||
#undef HAVE_SSE2
|
|
||||||
#define HAVE_MMX 1
|
|
||||||
#define HAVE_MMX2 1
|
|
||||||
#define HAVE_AMD3DNOW 0
|
|
||||||
#define HAVE_SSE 0
|
|
||||||
#define HAVE_SSE2 0
|
|
||||||
#define RENAME(a) a ## _MMX2
|
|
||||||
#include "libvo/aclib_template.c"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef COMPILE_AMD3DNOW
|
|
||||||
#undef RENAME
|
|
||||||
#undef HAVE_MMX
|
|
||||||
#undef HAVE_MMX2
|
|
||||||
#undef HAVE_AMD3DNOW
|
|
||||||
#undef HAVE_SSE
|
|
||||||
#undef HAVE_SSE2
|
|
||||||
#define HAVE_MMX 1
|
|
||||||
#define HAVE_MMX2 0
|
|
||||||
#define HAVE_AMD3DNOW 1
|
|
||||||
#define HAVE_SSE 0
|
|
||||||
#define HAVE_SSE2 0
|
|
||||||
#define RENAME(a) a ## _3DNow
|
|
||||||
#include "libvo/aclib_template.c"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef COMPILE_SSE
|
|
||||||
#undef RENAME
|
|
||||||
#undef HAVE_MMX
|
|
||||||
#undef HAVE_MMX2
|
|
||||||
#undef HAVE_AMD3DNOW
|
|
||||||
#undef HAVE_SSE
|
|
||||||
#undef HAVE_SSE2
|
|
||||||
#define HAVE_MMX 1
|
|
||||||
#define HAVE_MMX2 1
|
|
||||||
#define HAVE_AMD3DNOW 0
|
|
||||||
#define HAVE_SSE 1
|
|
||||||
#define HAVE_SSE2 1
|
|
||||||
#define RENAME(a) a ## _SSE
|
|
||||||
#include "libvo/aclib_template.c"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//#define ARR_SIZE 100000
|
|
||||||
#define ARR_SIZE (1024*768*2)
|
|
||||||
|
|
||||||
#ifdef CONFIG_MGA
|
|
||||||
|
|
||||||
#include "drivers/mga_vid.h"
|
|
||||||
|
|
||||||
static mga_vid_config_t mga_vid_config;
|
|
||||||
static unsigned char* frame = NULL;
|
|
||||||
static int f;
|
|
||||||
|
|
||||||
static int mga_init(void)
|
|
||||||
{
|
|
||||||
f = open("/dev/mga_vid", O_RDWR);
|
|
||||||
if (f == -1) {
|
|
||||||
fprintf(stderr, "Couldn't open /dev/mga_vid.\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
mga_vid_config.num_frames = 1;
|
|
||||||
mga_vid_config.frame_size = ARR_SIZE;
|
|
||||||
mga_vid_config.format = MGA_VID_FORMAT_YUY2;
|
|
||||||
|
|
||||||
mga_vid_config.colkey_on = 0;
|
|
||||||
mga_vid_config.src_width = 640;
|
|
||||||
mga_vid_config.src_height = 480;
|
|
||||||
mga_vid_config.dest_width = 320;
|
|
||||||
mga_vid_config.dest_height = 200;
|
|
||||||
mga_vid_config.x_org = 0;
|
|
||||||
mga_vid_config.y_org = 0;
|
|
||||||
|
|
||||||
mga_vid_config.version = MGA_VID_VERSION;
|
|
||||||
if (ioctl(f, MGA_VID_CONFIG, &mga_vid_config)) {
|
|
||||||
perror("Error in mga_vid_config ioctl()");
|
|
||||||
printf("Your mga_vid driver version is incompatible with this MPlayer version!\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
ioctl(f, MGA_VID_ON, 0);
|
|
||||||
|
|
||||||
frame = (char*)mmap(0, mga_vid_config.frame_size*mga_vid_config.num_frames,
|
|
||||||
PROT_WRITE,MAP_SHARED, f, 0);
|
|
||||||
if (!frame) {
|
|
||||||
printf("Can't mmap MGA frame.\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
//clear the buffer
|
|
||||||
//memset(frames[0], 0x80, mga_vid_config.frame_size*mga_vid_config.num_frames);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Returns current time in microseconds
|
|
||||||
static unsigned int GetTimer(void)
|
|
||||||
{
|
|
||||||
struct timeval tv;
|
|
||||||
struct timezone tz;
|
|
||||||
//float s;
|
|
||||||
gettimeofday(&tv, &tz);
|
|
||||||
//s = tv.tv_usec; s *= 0.000001; s += tv.tv_sec;
|
|
||||||
return tv.tv_sec * 1000000 + tv.tv_usec;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned long long int read_tsc(void)
|
|
||||||
{
|
|
||||||
unsigned long long int retval;
|
|
||||||
__asm__ volatile ("rdtsc":"=A" (retval)::"memory");
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char __attribute__((aligned(4096)))arr1[ARR_SIZE], arr2[ARR_SIZE];
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
unsigned long long int v1, v2;
|
|
||||||
unsigned char *marr1, *marr2;
|
|
||||||
int i;
|
|
||||||
unsigned int t;
|
|
||||||
#ifdef CONFIG_MGA
|
|
||||||
mga_init();
|
|
||||||
marr1 = &frame[3];
|
|
||||||
#else
|
|
||||||
marr1 = &arr1[0];
|
|
||||||
#endif
|
|
||||||
marr2 = &arr2[0];
|
|
||||||
|
|
||||||
for (i = 0; i < ARR_SIZE - 16; i++)
|
|
||||||
marr1[i] = marr2[i] = i;
|
|
||||||
|
|
||||||
#define testblock(func, name) \
|
|
||||||
t = GetTimer(); \
|
|
||||||
v1 = read_tsc(); \
|
|
||||||
for (i = 0; i < 100; i++) \
|
|
||||||
func(marr1, marr2, ARR_SIZE - 16); \
|
|
||||||
v2 = read_tsc(); \
|
|
||||||
t = GetTimer() - t; \
|
|
||||||
/* ARR_SIZE*100 / (1024*1024) / (t/1000000) = ARR_SIZE*95.36743 / t */ \
|
|
||||||
printf(name "CPU clocks=%llu = %dus (%5.3ffps) %5.1fMB/s\n", v2-v1, t, \
|
|
||||||
100000000.0f / (float)t, (float)ARR_SIZE*95.36743f / (float)t);
|
|
||||||
|
|
||||||
testblock(memcpy, "libc: ");
|
|
||||||
|
|
||||||
#if HAVE_MMX
|
|
||||||
testblock(fast_memcpy_MMX, "MMX: ");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_AMD3DNOW
|
|
||||||
testblock(fast_memcpy_3DNow, "3DNow!: ");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_MMX2
|
|
||||||
testblock(fast_memcpy_MMX2, "MMX2: ");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_SSE
|
|
||||||
testblock(fast_memcpy_SSE, "SSE: ");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,18 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# This is a wrapper around the -identify functionality.
|
|
||||||
# It is supposed to escape the output properly, so it can be easily
|
|
||||||
# used in shellscripts by 'eval'ing the output of this script.
|
|
||||||
#
|
|
||||||
# Written by Tobias Diedrich <ranma+mplayer@tdiedrich.de>
|
|
||||||
# Licensed under GNU GPL.
|
|
||||||
|
|
||||||
if [ -z "$1" ]; then
|
|
||||||
echo "Usage: midentify.sh <file> [<file> ...]"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
mplayer -vo null -ao null -frames 0 -identify "$@" 2>/dev/null |
|
|
||||||
sed -ne '/^ID_/ {
|
|
||||||
s/[]()|&;<>`'"'"'\\!$" []/\\&/g;p
|
|
||||||
}'
|
|
@ -1,182 +0,0 @@
|
|||||||
/*
|
|
||||||
* A program to modify a registry file.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2007 Alan Nisota
|
|
||||||
*
|
|
||||||
* This file is part of MPlayer.
|
|
||||||
*
|
|
||||||
* MPlayer is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* MPlayer is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with MPlayer; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <getopt.h>
|
|
||||||
#include "loader/registry.c"
|
|
||||||
|
|
||||||
#include "mp_msg.h"
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#define mp_msg(t, l, m, args...) fprintf(stderr, m, ##args)
|
|
||||||
#else
|
|
||||||
#define mp_msg(t, l, ...) fprintf(stderr, __VA_ARGS__)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "get_path.c"
|
|
||||||
|
|
||||||
static void remove_key(long handle, const char* name) {
|
|
||||||
int i, len;
|
|
||||||
char *fullname;
|
|
||||||
|
|
||||||
fullname = build_keyname(handle, name);
|
|
||||||
len = strlen(fullname);
|
|
||||||
for (i=0; i < reg_size;) {
|
|
||||||
if (!strncmp(regs[i].name, fullname, len)) {
|
|
||||||
free(regs[i].value);
|
|
||||||
free(regs[i].name);
|
|
||||||
memmove(®s[i], ®s[i+1], --reg_size*sizeof(struct reg_value));
|
|
||||||
} else {
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(fullname);
|
|
||||||
save_registry();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void parse_key(char *raw, HKEY *root, char *path, char *key) {
|
|
||||||
char *tmpkey, *start;
|
|
||||||
tmpkey = strrchr(raw, '\\');
|
|
||||||
if (tmpkey == raw || tmpkey == NULL) {
|
|
||||||
printf("Couldn't process key \"%s\"\n", raw);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
start = strchr(raw, '\\');
|
|
||||||
if (start == raw || start == NULL) {
|
|
||||||
printf("Couldn't process key \"%s\"\n", raw);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (strncmp(raw, "HKEY_CURRENT_USER\\", 18) == 0 ||
|
|
||||||
strncmp(raw, "HKCU\\", 5) == 0) {
|
|
||||||
*root = HKEY_CURRENT_USER;
|
|
||||||
} else if (strncmp(raw, "HKEY_LOCAL_MACHINE\\", 19) == 0 ||
|
|
||||||
strncmp(raw, "HKLM\\", 5) == 0) {
|
|
||||||
*root = HKEY_LOCAL_MACHINE;
|
|
||||||
} else {
|
|
||||||
printf("Couldn't process key \"%s\"\n", raw);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
strncpy(key, tmpkey + 1, strlen(tmpkey)-1);
|
|
||||||
key[strlen(tmpkey)-1] = 0;
|
|
||||||
while(*start == '\\')
|
|
||||||
start++;
|
|
||||||
while(*(tmpkey-1) == '\\')
|
|
||||||
tmpkey--;
|
|
||||||
strncpy(path, start, tmpkey - start);
|
|
||||||
path[tmpkey - start] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
int i;
|
|
||||||
long type = REG_SZ;
|
|
||||||
char c, path[256], key[256], *value = NULL;
|
|
||||||
HKEY root = 0;
|
|
||||||
int Option_Index;
|
|
||||||
int list = 0, del = 0;
|
|
||||||
int newkey, status;
|
|
||||||
static struct option Long_Options[] = {
|
|
||||||
{"registry", 1, 0, 'r'},
|
|
||||||
{"list", 0, 0, 'l'},
|
|
||||||
{"key", 1, 0, 'k'},
|
|
||||||
{"value", 1, 0, 'v'},
|
|
||||||
{"type", 1, 0, 't'},
|
|
||||||
{"del", 0, 0, 'd'},
|
|
||||||
};
|
|
||||||
while(1) {
|
|
||||||
c = getopt_long(argc, argv, "r:lk:v:t:id", Long_Options, &Option_Index);
|
|
||||||
if (c == EOF)
|
|
||||||
break;
|
|
||||||
switch(c) {
|
|
||||||
case 'r':
|
|
||||||
localregpathname = optarg;
|
|
||||||
break;
|
|
||||||
case 'l':
|
|
||||||
list = 1;
|
|
||||||
break;
|
|
||||||
case 'k':
|
|
||||||
parse_key(optarg, &root, path, key);
|
|
||||||
break;
|
|
||||||
case 'v':
|
|
||||||
value = optarg;
|
|
||||||
break;
|
|
||||||
case 't':
|
|
||||||
if (!strcmp(optarg, "string"))
|
|
||||||
type = REG_SZ;
|
|
||||||
else if (!strcmp(optarg, "dword"))
|
|
||||||
type = REG_DWORD;
|
|
||||||
break;
|
|
||||||
case 'd':
|
|
||||||
del = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (localregpathname == NULL || (! list && ! root)) {
|
|
||||||
printf("Must specify '-r' and either '-k' or '-l'\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (del && (list || value)) {
|
|
||||||
printf("Can't specify '-d' along with '-l' or '-v'\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
open_registry();
|
|
||||||
insert_handle(HKEY_LOCAL_MACHINE, "HKLM");
|
|
||||||
insert_handle(HKEY_CURRENT_USER, "HKCU");
|
|
||||||
|
|
||||||
if (del) {
|
|
||||||
char tmpname[256];
|
|
||||||
sprintf(tmpname, "%s\\%s", path, key);
|
|
||||||
remove_key(root, tmpname);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (list) {
|
|
||||||
for (i=0; i < reg_size; i++) {
|
|
||||||
if (regs[i].type == DIR) {
|
|
||||||
printf("Directory: %s\n", regs[i].name);
|
|
||||||
} else if (regs[i].type == REG_DWORD) {
|
|
||||||
DWORD v = *(DWORD *)regs[i].value;
|
|
||||||
printf("%s :: %08x type: DWORD\n", regs[i].name, v);
|
|
||||||
} else if (regs[i].type == REG_SZ) {
|
|
||||||
printf("%s :: '%s' len: %d type: String\n",
|
|
||||||
regs[i].name, regs[i].value, regs[i].len);
|
|
||||||
} else {
|
|
||||||
printf("%s :: '%s' len: %d type: %08x\n",
|
|
||||||
regs[i].name, regs[i].value, regs[i].len, regs[i].type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (root) {
|
|
||||||
RegCreateKeyExA(root, path, 0, 0, 0, 0, 0, &newkey, &status);
|
|
||||||
if (value != NULL) {
|
|
||||||
int len;
|
|
||||||
DWORD v;
|
|
||||||
if (type == REG_DWORD) {
|
|
||||||
len = sizeof(DWORD);
|
|
||||||
v = strtoul(value, NULL, 0);
|
|
||||||
value = (char *)&v;
|
|
||||||
} else
|
|
||||||
len = strlen(value)+1;
|
|
||||||
printf("%08x -- %d\n", *value, len);
|
|
||||||
RegSetValueExA(newkey, key, 0, type, value, len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
356
TOOLS/movinfo.c
356
TOOLS/movinfo.c
@ -1,356 +0,0 @@
|
|||||||
/* show QuickTime .mov file structure (C) 2001. by A'rpi/ESP-team
|
|
||||||
* various hacks by alex@naxine.org
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Blocks: 4bytes atom_size
|
|
||||||
4bytes atom_type (name)
|
|
||||||
...
|
|
||||||
|
|
||||||
By older files, mdat is at the beginning, and moov follows it later,
|
|
||||||
by newer files, moov is at the begininng.
|
|
||||||
|
|
||||||
Fontosabb typeok:
|
|
||||||
|
|
||||||
trak: track: ezeken belul van egy-egy stream (video/audio)
|
|
||||||
tkhd: track header: fps (video esten picture size is itt van)
|
|
||||||
vmhd: video media handler (video stream informaciok)
|
|
||||||
smhd: sound media handler (audio stream informaciok)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#undef NO_SPECIAL
|
|
||||||
|
|
||||||
static char *atom2human_type(int type)
|
|
||||||
{
|
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case 0x766F6F6D: return "Information sections"; /* moov */
|
|
||||||
case 0x6468766D: return "Movie header"; /* mvhd */
|
|
||||||
case 0x6169646D: return "Media stream"; /* mdia */
|
|
||||||
case 0x64686D76: return "Video media header"; /* vmhd */
|
|
||||||
case 0x64686D73: return "Sound media header"; /* smhd */
|
|
||||||
case 0x6468646D: return "Media header"; /* mdhd */
|
|
||||||
case 0x666E696D: return "Media information"; /* minf */
|
|
||||||
case 0x726C6468: return "Handler reference"; /* hdlr */
|
|
||||||
case 0x6B617274: return "New track (stream)"; /* trak */
|
|
||||||
case 0x75716D72: return "rmqu";
|
|
||||||
case 0x65657266: return "free";
|
|
||||||
case 0x64686B74: return "Track header"; /* tkhd */
|
|
||||||
case 0x61746475: return "User data"; /* udta */
|
|
||||||
case 0x7461646D: return "Movie data"; /* mdat */
|
|
||||||
case 0x6C627473: return "Sample information table"; /* stbl */
|
|
||||||
case 0x64737473: return "Sample description"; /* stsd */
|
|
||||||
case 0x6F637473: return "Chunk offset table"; /* stco */
|
|
||||||
case 0x73747473: return "Sample time table"; /* stts */
|
|
||||||
case 0x63737473: return "Sample->Chunk mapping table"; /* stsc */
|
|
||||||
case 0x7A737473: return "Sample size table"; /* stsz */
|
|
||||||
}
|
|
||||||
return "unknown";
|
|
||||||
}
|
|
||||||
|
|
||||||
#define S_NONE 0
|
|
||||||
#define S_AUDIO 1
|
|
||||||
#define S_VIDEO 2
|
|
||||||
int stream = S_NONE;
|
|
||||||
int v_stream = 0;
|
|
||||||
int a_stream = 0;
|
|
||||||
|
|
||||||
static unsigned int read_dword(FILE *f){
|
|
||||||
unsigned char atom_size_b[4];
|
|
||||||
if(fread(&atom_size_b,4,1,f)<=0) return -1;
|
|
||||||
return (atom_size_b[0]<<24)|(atom_size_b[1]<<16)|(atom_size_b[2]<<8)|atom_size_b[3];
|
|
||||||
}
|
|
||||||
|
|
||||||
static void video_stream_info(FILE *f, int len)
|
|
||||||
{
|
|
||||||
int orig_pos = ftell(f);
|
|
||||||
unsigned char data[len-8];
|
|
||||||
int i;
|
|
||||||
// char codec[len-8];
|
|
||||||
|
|
||||||
len -= 8;
|
|
||||||
for (i=0; i<len; i++)
|
|
||||||
fread(&data[i], 1, 1, f);
|
|
||||||
|
|
||||||
// strncpy(codec, &data[43], len-43);
|
|
||||||
// printf(" [codec: %s]\n", &codec);
|
|
||||||
fseek(f,orig_pos,SEEK_SET);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void audio_stream_info(FILE *f, int len)
|
|
||||||
{
|
|
||||||
int orig_pos = ftell(f);
|
|
||||||
unsigned char data[len-8];
|
|
||||||
int i;
|
|
||||||
|
|
||||||
len -= 8;
|
|
||||||
for (i=0; i<len; i++)
|
|
||||||
fread(&data[i], 1, 1, f);
|
|
||||||
|
|
||||||
printf(" [%d bit", data[19]);
|
|
||||||
if (data[17] == 1)
|
|
||||||
printf(" mono");
|
|
||||||
else
|
|
||||||
printf(" %d channels", data[17]);
|
|
||||||
printf("]\n");
|
|
||||||
fseek(f,orig_pos,SEEK_SET);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
static void userdata_info(FILE *f, int len, int pos, int level)
|
|
||||||
{
|
|
||||||
int orig_pos = pos; /*ftell(f);*/
|
|
||||||
unsigned int atom_size = 1;
|
|
||||||
unsigned int atom_type;
|
|
||||||
|
|
||||||
// printf("userdata @ %d:%d (%d)\n", pos, pos+len, len);
|
|
||||||
|
|
||||||
// fseek(f, pos+3, SEEK_SET);
|
|
||||||
|
|
||||||
while (atom_size != 0)
|
|
||||||
{
|
|
||||||
atom_size=read_dword(f);// if(fread(&atom_size_b,4,1,f)<=0) break;
|
|
||||||
if(fread(&atom_type,4,1,f)<=0) break;
|
|
||||||
|
|
||||||
if(atom_size<8) break; // error
|
|
||||||
|
|
||||||
// printf("%08X: %*s %.4s (%08X) %05d (begin: %08X)\n",pos,level*2,"",
|
|
||||||
// &atom_type,atom_type,atom_size,pos+8);
|
|
||||||
|
|
||||||
switch(atom_type)
|
|
||||||
{
|
|
||||||
case 0x797063A9: /* cpy (copyright) */
|
|
||||||
{
|
|
||||||
char *data = malloc(atom_size-8);
|
|
||||||
|
|
||||||
fseek(f, pos+6, SEEK_SET);
|
|
||||||
fread(data, atom_size-8, 1, f);
|
|
||||||
printf(" Copyright: %s\n", data);
|
|
||||||
free(data);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 0x666E69A9: /* inf (information) */
|
|
||||||
{
|
|
||||||
char data[atom_size-8];
|
|
||||||
|
|
||||||
fread(&data, 1, atom_size-8, f);
|
|
||||||
printf(" Owner: %s\n", &data);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 0x6D616EA9: /* nam (name) */
|
|
||||||
{
|
|
||||||
char data[atom_size-8];
|
|
||||||
|
|
||||||
fread(&data, 1, atom_size-8, f);
|
|
||||||
printf(" Name: %s\n", &data);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fseek(f,orig_pos,SEEK_SET);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int time_scale = 0;
|
|
||||||
|
|
||||||
static void lschunks(FILE *f,int level,unsigned int endpos){
|
|
||||||
unsigned int atom_size;
|
|
||||||
unsigned int atom_type;
|
|
||||||
int pos;
|
|
||||||
|
|
||||||
while(endpos==0 || ftell(f)<endpos){
|
|
||||||
pos=ftell(f);
|
|
||||||
atom_size=read_dword(f);// if(fread(&atom_size_b,4,1,f)<=0) break;
|
|
||||||
if(fread(&atom_type,4,1,f)<=0) break;
|
|
||||||
|
|
||||||
if(atom_size<8) break; // error
|
|
||||||
|
|
||||||
printf("%08X: %*s %.4s (%08X) %05d [%s] (begin: %08X)\n",pos,level*2,"",&atom_type,atom_type,atom_size,
|
|
||||||
atom2human_type(atom_type), pos+8); // 8: atom_size fields (4) + atom_type fields (4)
|
|
||||||
|
|
||||||
#ifndef NO_SPECIAL
|
|
||||||
// if (atom_type == 0x61746475)
|
|
||||||
// userdata_info(f, atom_size, pos, level);
|
|
||||||
|
|
||||||
if (atom_type == 0x6468646D)
|
|
||||||
{
|
|
||||||
char data[4];
|
|
||||||
|
|
||||||
fread(&data, 1, 1, f); // char
|
|
||||||
printf("mdhd version %d\n", data[0]);
|
|
||||||
fread(&data, 3, 1, f); // int24
|
|
||||||
fread(&data, 4, 1, f); // int32
|
|
||||||
fread(&data, 4, 1, f); // int32
|
|
||||||
fread(&data, 4, 1, f); // int32
|
|
||||||
time_scale = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];
|
|
||||||
printf("timescale: %d\n", time_scale);
|
|
||||||
fread(&data, 4, 1, f); // int32
|
|
||||||
fread(&data, 2, 1, f); // int16
|
|
||||||
fread(&data, 2, 1, f); // int16
|
|
||||||
}
|
|
||||||
|
|
||||||
if (atom_type == 0x64686D76)
|
|
||||||
{
|
|
||||||
stream = S_VIDEO;
|
|
||||||
printf(" Found VIDEO Stream #%d\n", v_stream++);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (atom_type == 0x64686D73)
|
|
||||||
{
|
|
||||||
stream = S_AUDIO;
|
|
||||||
printf(" Found AUDIO Stream #%d\n", a_stream++);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (atom_type == 0x64686B74) // tkhd - track header
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
unsigned char data[atom_size];
|
|
||||||
int x, y;
|
|
||||||
|
|
||||||
for (i=0; i<atom_size; i++)
|
|
||||||
fread(&data[i], 1, 1, f);
|
|
||||||
|
|
||||||
x = data[77];
|
|
||||||
y = data[81];
|
|
||||||
printf(" Flags: %d\n", data[3]);
|
|
||||||
printf(" Picture size: %dx%d\n", x, y);
|
|
||||||
if (x == 0 && y == 0)
|
|
||||||
printf(" Possible audio stream!\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if(atom_type==0x64737473) { // stsd
|
|
||||||
unsigned int tmp;
|
|
||||||
unsigned int count;
|
|
||||||
int i;
|
|
||||||
fread(&tmp,4,1,f);
|
|
||||||
count=read_dword(f);// fread(&count,4,1,f);
|
|
||||||
printf("desc count = %d\n",count);
|
|
||||||
for(i=0;i<count;i++){
|
|
||||||
unsigned int len;
|
|
||||||
unsigned int format;
|
|
||||||
len=read_dword(f); // fread(&len,4,1,f);
|
|
||||||
fread(&format,4,1,f);
|
|
||||||
printf(" desc #%d: %.4s (%d)\n",i+1,&format,len);
|
|
||||||
if (stream == S_VIDEO)
|
|
||||||
video_stream_info(f, len);
|
|
||||||
if (stream == S_AUDIO)
|
|
||||||
audio_stream_info(f, len);
|
|
||||||
fseek(f,len-8,SEEK_CUR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(atom_type==0x6F637473) { // stco
|
|
||||||
int len,i;
|
|
||||||
read_dword(f);
|
|
||||||
len=read_dword(f);
|
|
||||||
printf("Chunk table size :%d\n",len);
|
|
||||||
for(i=0;i<len;i++) printf(" chunk #%d: 0x%X\n",i+1,read_dword(f));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if(atom_type==0x73747473) { // stts
|
|
||||||
int len,i;
|
|
||||||
read_dword(f);
|
|
||||||
len=read_dword(f);
|
|
||||||
printf("T->S table size :%d\n",len);
|
|
||||||
for(i=0;i<len;i++){
|
|
||||||
int num=read_dword(f);
|
|
||||||
int dur=read_dword(f);
|
|
||||||
printf("%5d samples: %d duration", num, dur);
|
|
||||||
if (stream == S_AUDIO)
|
|
||||||
printf("(rate: %f Hz)\n", (float)time_scale/dur);
|
|
||||||
else
|
|
||||||
printf("(fps: %f)\n", (float)time_scale/dur);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(atom_type==0x63737473) { // stsc
|
|
||||||
int len,i;
|
|
||||||
read_dword(f);
|
|
||||||
len=read_dword(f);
|
|
||||||
printf("S->C table size :%d\n",len);
|
|
||||||
for(i=0;i<len;i++){
|
|
||||||
int first=read_dword(f);
|
|
||||||
int spc=read_dword(f);
|
|
||||||
int sdid=read_dword(f);
|
|
||||||
printf(" chunk %d... %d s/c desc: %d\n",first,spc,sdid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(atom_type==0x7A737473) { // stsz
|
|
||||||
int len,i,ss;
|
|
||||||
read_dword(f);
|
|
||||||
ss=read_dword(f);
|
|
||||||
len=read_dword(f);
|
|
||||||
printf("Sample size table len: %d\n",len);
|
|
||||||
if(ss){
|
|
||||||
printf(" common sample size: %d bytes\n",ss);
|
|
||||||
} else {
|
|
||||||
for(i=0;i<len;i++) printf(" sample #%d: %d bytes\n",i+1,read_dword(f));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
switch(atom_type){
|
|
||||||
case 0x7461646D: // mdat Movie data
|
|
||||||
case 0x75716D72: // rmqu
|
|
||||||
case 0x65657266: // free JUNK
|
|
||||||
case 0x64686B74: // tkhd Track header
|
|
||||||
case 0x61746475: // udta User data
|
|
||||||
case 0x64737473: // stsd Sample description
|
|
||||||
case 0x6F637473: // stco Chunk offset table
|
|
||||||
case 0x73747473: // stts Sample time table
|
|
||||||
case 0x63737473: // stsc Sample->Chunk mapping table
|
|
||||||
case 0x7A737473: // stsz Sample size table
|
|
||||||
case 0x746f6e70: // pnot
|
|
||||||
case 0x54434950: // PICT
|
|
||||||
case 0x70797466:
|
|
||||||
break;
|
|
||||||
default: lschunks(f,level+1,pos+atom_size);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
switch(atom_type){
|
|
||||||
case 0x766F6F6D: // moov
|
|
||||||
case 0x61726D72: // rmra
|
|
||||||
case 0x61646D72: // rmda
|
|
||||||
lschunks(f,level+1,pos+atom_size);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
fseek(f,pos+atom_size,SEEK_SET);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc,char* argv[])
|
|
||||||
{
|
|
||||||
FILE *f;
|
|
||||||
|
|
||||||
if ((f = fopen(argc>1?argv[1]:"Akira.mov","rb")) == NULL)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
printf("%.8s %.4s (%.8s) %5s [%s]\n\n",
|
|
||||||
"position", "atom", "atomtype", "len", "human readable atom name");
|
|
||||||
|
|
||||||
lschunks(f, 0, 0);
|
|
||||||
|
|
||||||
printf("\nSummary: streams: %d video/%d audio\n", v_stream, a_stream);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# Script to run mplayer on the console (fbdev/mga_vid/etc) without
|
|
||||||
# the console text and/or flashing cursor getting in the way.
|
|
||||||
# Written by Rich Felker.
|
|
||||||
|
|
||||||
trap "tput cnorm ; exit 1" SIGQUIT SIGINT EXIT
|
|
||||||
res=`PATH="$PATH:/usr/sbin" fbset | grep geometry | sed 's/^ *//'`
|
|
||||||
width=`echo "$res" | cut -d' ' -f2`
|
|
||||||
height=`echo "$res" | cut -d' ' -f3`
|
|
||||||
tput civis
|
|
||||||
clear
|
|
||||||
mplayer -vo mga -screenw "$width" -screenh "$height" "$@" >/dev/null 2>&1
|
|
@ -1,66 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
|
|
||||||
# Tool to compare MPlayer translation files against a base file. Reports
|
|
||||||
# conflicting arguments, extra strings not present in the base file and
|
|
||||||
# (optionally) missing strings.
|
|
||||||
|
|
||||||
# Written by Uoti Urpala
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import re
|
|
||||||
|
|
||||||
def parse(filename):
|
|
||||||
r = {}
|
|
||||||
f = open(filename)
|
|
||||||
it = iter(f)
|
|
||||||
cur = ''
|
|
||||||
for line in it:
|
|
||||||
line = line.strip()
|
|
||||||
if not line.startswith('#define'):
|
|
||||||
while line and line[-1] == '\\':
|
|
||||||
line = it.next().strip()
|
|
||||||
continue
|
|
||||||
_, name, value = line.split(None, 2)
|
|
||||||
value = value.strip('"')
|
|
||||||
while line[-1] == '\\':
|
|
||||||
line = it.next().strip()
|
|
||||||
value += line.rstrip('\\').strip('"')
|
|
||||||
r[name] = value
|
|
||||||
f.close()
|
|
||||||
return r
|
|
||||||
|
|
||||||
def compare(base, other, show_missing=False):
|
|
||||||
r = re.compile('%[^diouxXeEfFgGaAcspn%]*[diouxXeEfFgGaAcspn%]')
|
|
||||||
missing = []
|
|
||||||
for key in base:
|
|
||||||
if key not in other:
|
|
||||||
missing.append(key)
|
|
||||||
continue
|
|
||||||
if re.findall(r, base[key]) != re.findall(r, other[key]):
|
|
||||||
print 'Mismatch: ', key
|
|
||||||
print base[key]
|
|
||||||
print other[key]
|
|
||||||
print
|
|
||||||
del other[key]
|
|
||||||
if other:
|
|
||||||
extra = other.keys()
|
|
||||||
extra.sort()
|
|
||||||
print 'Extra: ', ' '.join(extra)
|
|
||||||
if show_missing and missing:
|
|
||||||
missing.sort()
|
|
||||||
print 'Missing: ', ' '.join(missing)
|
|
||||||
|
|
||||||
if len(sys.argv) < 3:
|
|
||||||
print 'Usage:\n'+sys.argv[0]+' [--missing] base_helpfile otherfile1 '\
|
|
||||||
'[otherfile2 ...]'
|
|
||||||
sys.exit(1)
|
|
||||||
i = 1
|
|
||||||
show_missing = False
|
|
||||||
if sys.argv[i] in ( '--missing', '-missing' ):
|
|
||||||
show_missing = True
|
|
||||||
i = 2
|
|
||||||
base = parse(sys.argv[i])
|
|
||||||
for filename in sys.argv[i+1:]:
|
|
||||||
print '*****', filename
|
|
||||||
compare(base, parse(filename), show_missing)
|
|
||||||
print '\n'
|
|
@ -1,45 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# example how to output video on multiple windows in sync.
|
|
||||||
# might be even more useful in combination with vo ggi
|
|
||||||
# to distribute the video arbitrarily
|
|
||||||
|
|
||||||
dir=/tmp/$$
|
|
||||||
count=$1
|
|
||||||
shift
|
|
||||||
|
|
||||||
if test 0"$count" -lt 1; then
|
|
||||||
echo "At least 1 slave instance must be used."
|
|
||||||
echo ""
|
|
||||||
echo "Usage:"
|
|
||||||
echo "./mplmult.sh n mplayer-opts"
|
|
||||||
echo "n number of MPlayer instances that display the video"
|
|
||||||
echo "mplayer-opts anything you would specify to mplayer,"
|
|
||||||
echo " more than one file will usually not work"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -m 700 $dir
|
|
||||||
if test $? -ne 0; then
|
|
||||||
echo "Could not create temp dir!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkfifo $dir/stream.yuv
|
|
||||||
i=1
|
|
||||||
fifo_list=""
|
|
||||||
while test $i -le $count; do
|
|
||||||
fifo_list="$dir/mp$i $fifo_list"
|
|
||||||
i=$(($i+1))
|
|
||||||
done
|
|
||||||
|
|
||||||
mkfifo $fifo_list
|
|
||||||
(cat $dir/stream.yuv | tee $fifo_list > /dev/null ) &
|
|
||||||
for fifo in $fifo_list; do
|
|
||||||
# -benchmark is neccessary so that it will not do any timing.
|
|
||||||
# the master instance already takes care of it and not specifying
|
|
||||||
# it will break A-V sync.
|
|
||||||
mplayer -nocache -quiet -benchmark "$fifo" > /dev/null 2>&1 &
|
|
||||||
done
|
|
||||||
mplayer -nocache -fixed-vo -vo yuv4mpeg:file=$dir/stream.yuv "$@"
|
|
||||||
|
|
||||||
rm -rf $dir
|
|
@ -1,366 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) Alban Bedel - 04/2003
|
|
||||||
*
|
|
||||||
* This file is part of MPlayer.
|
|
||||||
*
|
|
||||||
* MPlayer is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* MPlayer is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with MPlayer; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#if !HAVE_WINSOCK2_H
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#else
|
|
||||||
#include <winsock2.h>
|
|
||||||
#include <ws2tcpip.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "stream/stream.h"
|
|
||||||
#include "libmpdemux/demuxer.h"
|
|
||||||
#include "mp_msg.h"
|
|
||||||
#include "libavutil/common.h"
|
|
||||||
#include "mpbswap.h"
|
|
||||||
|
|
||||||
/// Netstream packets def and some helpers
|
|
||||||
#include "stream/stream_netstream.h"
|
|
||||||
|
|
||||||
// linking hacks
|
|
||||||
char *info_name;
|
|
||||||
char *info_artist;
|
|
||||||
char *info_genre;
|
|
||||||
char *info_subject;
|
|
||||||
char *info_copyright;
|
|
||||||
char *info_sourceform;
|
|
||||||
char *info_comment;
|
|
||||||
|
|
||||||
char* out_filename = NULL;
|
|
||||||
char* force_fourcc=NULL;
|
|
||||||
char* passtmpfile="divx2pass.log";
|
|
||||||
|
|
||||||
static unsigned short int port = 10000;
|
|
||||||
|
|
||||||
typedef struct client_st client_t;
|
|
||||||
struct client_st {
|
|
||||||
int fd;
|
|
||||||
stream_t* stream;
|
|
||||||
client_t* next;
|
|
||||||
client_t* prev;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int write_error(int fd,char* msg) {
|
|
||||||
int len = strlen(msg) + 1;
|
|
||||||
return write_packet(fd,NET_STREAM_ERROR,msg,len);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int net_stream_open(client_t* cl,char* url) {
|
|
||||||
int file_format=DEMUXER_TYPE_UNKNOWN;
|
|
||||||
mp_net_stream_opened_t ret;
|
|
||||||
|
|
||||||
if(cl->stream) {
|
|
||||||
if(!write_error(cl->fd,"A stream is currently opened\n"))
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
mp_msg(MSGT_NETST,MSGL_V,"Open stream %s\n",url);
|
|
||||||
cl->stream = open_stream(url,NULL,&file_format);
|
|
||||||
if(!cl->stream) {
|
|
||||||
if(!write_error(cl->fd,"Open failed\n"))
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
stream_reset(cl->stream);
|
|
||||||
stream_seek(cl->stream,cl->stream->start_pos);
|
|
||||||
ret.file_format = file_format;
|
|
||||||
ret.flags = cl->stream->flags;
|
|
||||||
ret.sector_size = cl->stream->sector_size;
|
|
||||||
ret.start_pos = cl->stream->start_pos;
|
|
||||||
ret.end_pos = cl->stream->end_pos;
|
|
||||||
net_stream_opened_2_me(&ret);
|
|
||||||
|
|
||||||
if(!write_packet(cl->fd,NET_STREAM_OK,(char*)&ret,sizeof(mp_net_stream_opened_t)))
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int net_stream_fill_buffer(client_t* cl,uint16_t max_len) {
|
|
||||||
int r;
|
|
||||||
mp_net_stream_packet_t *pack;
|
|
||||||
|
|
||||||
if(!cl->stream) {
|
|
||||||
if(!write_error(cl->fd,"No stream is currently opened\n"))
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if(max_len == 0) {
|
|
||||||
if(!write_error(cl->fd,"Fill buffer called with 0 length\n"))
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
pack = malloc(max_len + sizeof(mp_net_stream_packet_t));
|
|
||||||
pack->cmd = NET_STREAM_OK;
|
|
||||||
r = stream_read(cl->stream,pack->data,max_len);
|
|
||||||
pack->len = le2me_16(r + sizeof(mp_net_stream_packet_t));
|
|
||||||
if(!net_write(cl->fd,(char*)pack,le2me_16(pack->len))) {
|
|
||||||
free(pack);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
free(pack);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int net_stream_seek(client_t* cl, uint64_t pos) {
|
|
||||||
|
|
||||||
if(!cl->stream) {
|
|
||||||
if(!write_error(cl->fd,"No stream is currently opened\n"))
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!stream_seek(cl->stream,(off_t)pos)) {
|
|
||||||
if(!write_error(cl->fd,"Seek failed\n"))
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if(!write_packet(cl->fd,NET_STREAM_OK,NULL,0))
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int net_stream_reset(client_t* cl) {
|
|
||||||
if(!cl->stream) {
|
|
||||||
if(!write_error(cl->fd,"No stream is currently opened\n"))
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
stream_reset(cl->stream);
|
|
||||||
if(!write_packet(cl->fd,NET_STREAM_OK,NULL,0))
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int net_stream_close(client_t* cl) {
|
|
||||||
if(!cl->stream) {
|
|
||||||
if(!write_error(cl->fd,"No stream is currently opened\n"))
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
free_stream(cl->stream);
|
|
||||||
cl->stream = NULL;
|
|
||||||
|
|
||||||
if(!write_packet(cl->fd,NET_STREAM_OK,NULL,0))
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int handle_client(client_t* cl,mp_net_stream_packet_t* pack) {
|
|
||||||
|
|
||||||
if(!pack)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
switch(pack->cmd) {
|
|
||||||
case NET_STREAM_OPEN:
|
|
||||||
if(((char*)pack)[pack->len-1] != '\0') {
|
|
||||||
mp_msg(MSGT_NETST,MSGL_WARN,"Got invalid open packet\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return net_stream_open(cl,pack->data);
|
|
||||||
case NET_STREAM_FILL_BUFFER:
|
|
||||||
if(pack->len != sizeof(mp_net_stream_packet_t) + 2) {
|
|
||||||
mp_msg(MSGT_NETST,MSGL_WARN,"Got invalid fill buffer packet\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return net_stream_fill_buffer(cl,le2me_16(*((uint16_t*)pack->data)));
|
|
||||||
case NET_STREAM_SEEK:
|
|
||||||
if(pack->len != sizeof(mp_net_stream_packet_t) + 8) {
|
|
||||||
mp_msg(MSGT_NETST,MSGL_WARN,"Got invalid fill buffer packet\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return net_stream_seek(cl,le2me_64(*((uint64_t*)pack->data)));
|
|
||||||
case NET_STREAM_RESET:
|
|
||||||
return net_stream_reset(cl);
|
|
||||||
case NET_STREAM_CLOSE:
|
|
||||||
if(pack->len != sizeof(mp_net_stream_packet_t)){
|
|
||||||
mp_msg(MSGT_NETST,MSGL_WARN,"Got invalid fill buffer packet\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return net_stream_close(cl);
|
|
||||||
default:
|
|
||||||
mp_msg(MSGT_NETST,MSGL_WARN,"Got unknown command %d\n",pack->cmd);
|
|
||||||
if(!write_error(cl->fd,"Unknown command\n"))
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static client_t* add_client(client_t *head,int fd) {
|
|
||||||
client_t *new = calloc(1,sizeof(client_t));
|
|
||||||
new->fd = fd;
|
|
||||||
if(!head) return new;
|
|
||||||
new->next = head;
|
|
||||||
head->prev = new;
|
|
||||||
return new;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int make_fd_set(fd_set* fds, client_t** _cl, int listen) {
|
|
||||||
int max_fd = listen;
|
|
||||||
client_t *cl = *_cl;
|
|
||||||
FD_ZERO(fds);
|
|
||||||
FD_SET(listen,fds);
|
|
||||||
while(cl) {
|
|
||||||
// Remove this client
|
|
||||||
if(cl->fd < 0) {
|
|
||||||
client_t* f = cl;
|
|
||||||
if(cl->prev) cl->prev->next = cl->next;
|
|
||||||
if(cl->next) cl->next->prev = cl->prev;
|
|
||||||
if(cl->stream) free_stream(cl->stream);
|
|
||||||
if(!cl->prev) // Remove the head
|
|
||||||
*_cl = cl->next;
|
|
||||||
cl = cl->next;
|
|
||||||
free(f);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
FD_SET(cl->fd,fds);
|
|
||||||
if(cl->fd > max_fd) max_fd = cl->fd;
|
|
||||||
cl = cl->next;
|
|
||||||
}
|
|
||||||
return max_fd+1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Hack to 'cleanly' exit
|
|
||||||
static int run_server = 1;
|
|
||||||
|
|
||||||
void exit_sig(int sig) {
|
|
||||||
static int count = 0;
|
|
||||||
sig++; // gcc warning
|
|
||||||
count++;
|
|
||||||
if(count==3) exit(1);
|
|
||||||
if(count > 3)
|
|
||||||
#ifdef __MINGW32__
|
|
||||||
WSACleanup();
|
|
||||||
#else
|
|
||||||
kill(getpid(),SIGKILL);
|
|
||||||
#endif
|
|
||||||
run_server = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int main_loop(int listen_fd) {
|
|
||||||
client_t *clients = NULL,*iter;
|
|
||||||
fd_set fds;
|
|
||||||
|
|
||||||
signal(SIGTERM,exit_sig); // kill
|
|
||||||
#ifndef __MINGW32__
|
|
||||||
signal(SIGHUP,exit_sig); // kill -HUP / xterm closed
|
|
||||||
signal(SIGINT,exit_sig); // Interrupt from keyboard
|
|
||||||
signal(SIGQUIT,exit_sig); // Quit from keyboard
|
|
||||||
#endif
|
|
||||||
|
|
||||||
while(run_server) {
|
|
||||||
int sel_n = make_fd_set(&fds,&clients,listen_fd);
|
|
||||||
int n = select(sel_n,&fds,NULL,NULL,NULL);
|
|
||||||
if(n < 0) {
|
|
||||||
if(errno == EINTR)
|
|
||||||
continue;
|
|
||||||
mp_msg(MSGT_NETST,MSGL_FATAL,"Select error: %s\n",strerror(errno));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
// New connection
|
|
||||||
if(FD_ISSET(listen_fd,&fds)) {
|
|
||||||
struct sockaddr_in addr;
|
|
||||||
socklen_t slen = sizeof(struct sockaddr_in);
|
|
||||||
int client_fd = accept(listen_fd,(struct sockaddr*)&addr,&slen);
|
|
||||||
if(client_fd < 0) {
|
|
||||||
mp_msg(MSGT_NETST,MSGL_ERR,"accept failed: %s\n",strerror(errno));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
mp_msg(MSGT_NETST,MSGL_V,"New client from %s\n",inet_ntoa(addr.sin_addr));
|
|
||||||
clients = add_client(clients,client_fd);
|
|
||||||
if(n == 1) continue;
|
|
||||||
}
|
|
||||||
// Look for the clients
|
|
||||||
for(iter = clients ; iter ; iter = iter->next) {
|
|
||||||
mp_net_stream_packet_t* pack;
|
|
||||||
if(!FD_ISSET(iter->fd,&fds)) continue;
|
|
||||||
pack = read_packet(iter->fd);
|
|
||||||
if(!pack) {
|
|
||||||
close(iter->fd);
|
|
||||||
iter->fd = -1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if(!handle_client(iter,pack)) {
|
|
||||||
close(iter->fd);
|
|
||||||
iter->fd = -1;
|
|
||||||
}
|
|
||||||
free(pack);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mp_msg(MSGT_NETST,MSGL_INFO,"Exit ....\n");
|
|
||||||
close(listen_fd);
|
|
||||||
#ifdef __MINGW32__
|
|
||||||
WSACleanup();
|
|
||||||
#endif
|
|
||||||
while(clients) {
|
|
||||||
client_t* f = clients;
|
|
||||||
if(f->stream) free_stream(f->stream);
|
|
||||||
if(f->fd > 0) close(f->fd);
|
|
||||||
free(f);
|
|
||||||
clients = clients->next;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
int listen_fd;
|
|
||||||
struct sockaddr_in addr;
|
|
||||||
|
|
||||||
mp_msg_init();
|
|
||||||
// mp_msg_set_level(verbose+MSGL_STATUS);
|
|
||||||
|
|
||||||
#ifdef __MINGW32__
|
|
||||||
WSADATA wsaData;
|
|
||||||
WSAStartup(MAKEWORD(1,1), &wsaData);
|
|
||||||
#endif
|
|
||||||
listen_fd = socket(AF_INET, SOCK_STREAM, 0);
|
|
||||||
if(listen_fd < 0) {
|
|
||||||
mp_msg(MSGT_NETST,MSGL_FATAL,"Failed to create listen_fd: %s\n",strerror(errno));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
memset(&addr,0,sizeof(struct sockaddr));
|
|
||||||
addr.sin_addr.s_addr = INADDR_ANY;
|
|
||||||
addr.sin_port = htons(port);
|
|
||||||
addr.sin_family = AF_INET;
|
|
||||||
if(bind(listen_fd,(struct sockaddr*)&addr,sizeof(struct sockaddr))) {
|
|
||||||
mp_msg(MSGT_NETST,MSGL_FATAL,"Failed to bind listen socket: %s\n",strerror(errno));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if(listen(listen_fd,1)) {
|
|
||||||
mp_msg(MSGT_NETST,MSGL_FATAL,"Failed to turn the socket in listen state: %s\n",strerror(errno));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return main_loop(listen_fd);
|
|
||||||
}
|
|
@ -1,234 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
#
|
|
||||||
# Licence: GPL
|
|
||||||
#
|
|
||||||
# 2003/02/09 Jonas Jermann <jjermann@gmx.net>
|
|
||||||
#
|
|
||||||
# Script: Draw PSNR log graphs using gnuplot
|
|
||||||
#
|
|
||||||
# requires: gnuplot
|
|
||||||
|
|
||||||
use Getopt::Long;
|
|
||||||
|
|
||||||
# MAIN
|
|
||||||
my %options;
|
|
||||||
my $dem_file="psnr.dem";
|
|
||||||
|
|
||||||
commandline();
|
|
||||||
demo_file();
|
|
||||||
|
|
||||||
system ("gnuplot $dem_file");
|
|
||||||
system("rm $dem_file $options{file}.[IPB] $options{file}.diff* 2>/dev/null");
|
|
||||||
exit 0;
|
|
||||||
|
|
||||||
|
|
||||||
# DEMO FILE
|
|
||||||
sub demo_file {
|
|
||||||
|
|
||||||
if ($options{file2}) {
|
|
||||||
my @file1_cont = ();
|
|
||||||
my @file2_cont = ();
|
|
||||||
my $NewRow,$i,$j;
|
|
||||||
|
|
||||||
open(LIST_IN, "$options{file}"); while( <LIST_IN> ) {
|
|
||||||
$NewRow=[];
|
|
||||||
@$NewRow = split(/[ ,]+/, $_);
|
|
||||||
push( @file1_cont, $NewRow );
|
|
||||||
}
|
|
||||||
close(LIST_IN);
|
|
||||||
|
|
||||||
open(LIST_IN2, "$options{file2}"); while( <LIST_IN2> ) {
|
|
||||||
$NewRow=[];
|
|
||||||
@$NewRow = split(/[ ,]+/, $_);
|
|
||||||
push( @file2_cont, $NewRow );
|
|
||||||
}
|
|
||||||
close(LIST_IN2);
|
|
||||||
|
|
||||||
open(LIST_OUT, ">$options{file}.diff");
|
|
||||||
for($i=0; $i<=$#file2_cont; $i++) {
|
|
||||||
print LIST_OUT " $file2_cont[$i]->[1],\ ";
|
|
||||||
for($j=2; $j<=7; $j++) {
|
|
||||||
$file2_cont[$i]->[$j] -= $file1_cont[$i]->[$j];
|
|
||||||
print LIST_OUT " $file2_cont[$i]->[$j],\ ";
|
|
||||||
}
|
|
||||||
print LIST_OUT " $file2_cont[$i]->[8]\n";
|
|
||||||
}
|
|
||||||
close(LIST_OUT);
|
|
||||||
$options{file}="$options{file}.diff";
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($options{iframes}) { system("cat $options{file} | grep I > $options{file}.I"); }
|
|
||||||
if ($options{pframes}) { system("cat $options{file} | grep P > $options{file}.P"); }
|
|
||||||
if ($options{bframes}) { system("cat $options{file} | grep B > $options{file}.B"); }
|
|
||||||
|
|
||||||
open(DEM_FILE,">$dem_file");
|
|
||||||
|
|
||||||
print DEM_FILE "#PSNR Statistics
|
|
||||||
#---------------
|
|
||||||
|
|
||||||
set title \"PSNR Statistics\"
|
|
||||||
set data style fsteps
|
|
||||||
set xlabel \"Frames\"
|
|
||||||
set grid
|
|
||||||
|
|
||||||
|
|
||||||
";
|
|
||||||
|
|
||||||
if ($options{quant}) {
|
|
||||||
print DEM_FILE "# Quantizers
|
|
||||||
plot [] [0:] \\";
|
|
||||||
if ($options{pframes}) {
|
|
||||||
print DEM_FILE "
|
|
||||||
\"$options{file}.P\" using 1:2 t \"Quantizer: P frames\" w $options{qs}";
|
|
||||||
if ($options{bframes} || $options{iframes}) { print DEM_FILE ",\\"; }
|
|
||||||
}
|
|
||||||
if ($options{bframes}) {
|
|
||||||
print DEM_FILE "
|
|
||||||
\"$options{file}.B\" using 1:2 t \"Quantizer: B frames\" w $options{qs}";
|
|
||||||
if ($options{iframes}) { print DEM_FILE ",\\"; }
|
|
||||||
}
|
|
||||||
if ($options{iframes}) {
|
|
||||||
print DEM_FILE "
|
|
||||||
\"$options{file}.I\" using 1:2 t \"Quantizer: I frames\" w $options{qs}";
|
|
||||||
}
|
|
||||||
if (!($options{pframes} || $options{bframes} || $options{iframes})) {
|
|
||||||
print DEM_FILE "
|
|
||||||
\"$options{file}\" using 1:2 t \"Quantizer\" w $options{qs}";
|
|
||||||
}
|
|
||||||
|
|
||||||
print DEM_FILE "
|
|
||||||
pause -1
|
|
||||||
|
|
||||||
";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if ($options{size}) {
|
|
||||||
print DEM_FILE "# Frame size
|
|
||||||
plot \\";
|
|
||||||
if ($options{pframes}) {
|
|
||||||
print DEM_FILE "
|
|
||||||
\"$options{file}.P\" using 1:3 t \"Size: P frames\" w $options{ss}";
|
|
||||||
if ($options{bframes}||$options{iframes}) { print DEM_FILE ",\\"; }
|
|
||||||
}
|
|
||||||
if ($options{bframes}) {
|
|
||||||
print DEM_FILE "
|
|
||||||
\"$options{file}.B\" using 1:3 t \"Size: B frames\" w $options{ss}";
|
|
||||||
if ($options{iframes}) { print DEM_FILE ",\\"; }
|
|
||||||
}
|
|
||||||
if ($options{iframes}) {
|
|
||||||
print DEM_FILE "
|
|
||||||
\"$options{file}.I\" using 1:3 t \"Size: I frames\" w $options{ss}";
|
|
||||||
}
|
|
||||||
if (!($options{pframes}||$options{bframes}||$options{iframes})) {
|
|
||||||
print DEM_FILE "
|
|
||||||
\"$options{file}\" using 1:3 t \"Size\" w $options{ss}";
|
|
||||||
}
|
|
||||||
|
|
||||||
print DEM_FILE "
|
|
||||||
pause -1
|
|
||||||
|
|
||||||
";
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($options{psnr}) {
|
|
||||||
print DEM_FILE "# PSNR
|
|
||||||
plot \\";
|
|
||||||
if ($options{pframes}) {
|
|
||||||
print DEM_FILE "
|
|
||||||
\"$options{file}.P\" using (\$1):(\$7) t \"PSNR (All): P frames\" w $options{ps}";
|
|
||||||
if ($options{bframes}||$options{iframes}) { print DEM_FILE ",\\"; }
|
|
||||||
}
|
|
||||||
if ($options{bframes}) {
|
|
||||||
print DEM_FILE "
|
|
||||||
\"$options{file}.B\" using (\$1):(\$7) t \"PSNR (All): B frames\" w $options{ps}";
|
|
||||||
if ($options{iframes}) { print DEM_FILE ",\\"; }
|
|
||||||
}
|
|
||||||
if ($options{iframes}) {
|
|
||||||
print DEM_FILE "
|
|
||||||
\"$options{file}.I\" using (\$1):(\$7) t \"PSNR (All): I frames\" w $options{ps}";
|
|
||||||
}
|
|
||||||
if (!($options{pframes}||$options{bframes}||$options{iframes})) {
|
|
||||||
print DEM_FILE "
|
|
||||||
\"$options{file}\" using (\$1):(\$7) t \"PSNR (All)\" w $options{ps}";
|
|
||||||
}
|
|
||||||
|
|
||||||
print DEM_FILE "
|
|
||||||
#\"$options{file}\" using (\$1):(\$4) t \"PSNR (Y)\" w $options{ps} \\
|
|
||||||
#\"$options{file}\" using (\$1):(\$5) t \"PSNR (Cb)\" w $options{ps} \\
|
|
||||||
#\"$options{file}\" using (\$1):(\$6) t \"PSNR (Cr)\" w $options{ps}
|
|
||||||
pause -1
|
|
||||||
|
|
||||||
";
|
|
||||||
}
|
|
||||||
|
|
||||||
print DEM_FILE "
|
|
||||||
reset";
|
|
||||||
|
|
||||||
close (DEM_FILE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# USAGE
|
|
||||||
sub usage {
|
|
||||||
print STDERR <<EOF;
|
|
||||||
|
|
||||||
Usage: plotpsnr.pl [options] 'file'
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-h, --help Display this help message
|
|
||||||
-quant Display quantizers
|
|
||||||
-size Display size
|
|
||||||
-psnr Display PSNR
|
|
||||||
-iframes Display I frames
|
|
||||||
-pframes Display P frames
|
|
||||||
-bframes Display B frames
|
|
||||||
-aframes Display all frames in different colors
|
|
||||||
-cmp <file2> Compare two files
|
|
||||||
-qs <style> Quantizer style
|
|
||||||
-ss <style> Size style
|
|
||||||
-ps <style> PSNR style
|
|
||||||
|
|
||||||
Default: -quant -size -psnr -qs "p" -ss "i" -ps "p"
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
Comparison is based on file2.
|
|
||||||
Comparison assumes that the frame numbers of both files fit.
|
|
||||||
|
|
||||||
EOF
|
|
||||||
exit 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# COMMAND LINE
|
|
||||||
sub commandline {
|
|
||||||
$options{qs}="p";
|
|
||||||
$options{ss}="i";
|
|
||||||
$options{ps}="p";
|
|
||||||
|
|
||||||
GetOptions(
|
|
||||||
"help|h" => \&usage,
|
|
||||||
"quant" => \$options{quant},
|
|
||||||
"size" => \$options{size},
|
|
||||||
"psnr" => \$options{psnr},
|
|
||||||
"cmp=s" => \$options{file2},
|
|
||||||
"iframes" => \$options{iframes},
|
|
||||||
"pframes" => \$options{pframes},
|
|
||||||
"bframes" => \$options{bframes},
|
|
||||||
"aframes" => sub { $options{iframes} = 1;
|
|
||||||
$options{pframes} = 1;
|
|
||||||
$options{bframes} = 1; },
|
|
||||||
"qs=s" => \$options{qs},
|
|
||||||
"ss=s" => \$options{ss},
|
|
||||||
"ps=s" => \$options{ps},
|
|
||||||
) || usage();
|
|
||||||
|
|
||||||
if (!($options{quant}||$options{size}||$options{psnr})) {
|
|
||||||
$options{quant}=1;
|
|
||||||
$options{size}=1;
|
|
||||||
$options{psnr}=1;
|
|
||||||
}
|
|
||||||
|
|
||||||
$options{file}="@ARGV";
|
|
||||||
}
|
|
@ -1,179 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Helper script to ease comparing the PSNR between two video files
|
|
||||||
# Copyleft 2005 by Matthias Wieser
|
|
||||||
# Copyleft 2005 by Ivo
|
|
||||||
# This file comes under GPL, see http://www.gnu.org/copyleft/gpl.html for more
|
|
||||||
# information on its licensing.
|
|
||||||
|
|
||||||
warning_frame_number () {
|
|
||||||
echo "Files have differing numbers of frames!"
|
|
||||||
echo "$FILE1 has `ls -1 ${TEMPDIR}/FILE1/*ppm | wc -l` frames,"
|
|
||||||
echo "$FILE2 has `ls -1 ${TEMPDIR}/FILE2/*ppm | wc -l` frames."
|
|
||||||
echo "Processing the first `ls -1 ${TEMPDIR}/FILE2/*ppm | wc -l` frames."
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
TEMPDIR="/tmp/psnr_video"
|
|
||||||
WORKDIR=`pwd`
|
|
||||||
OUTFILE=psnr.dat
|
|
||||||
ERRFILE=errorsum.del
|
|
||||||
|
|
||||||
exit=0
|
|
||||||
if [[ `which pnmpsnr 2> /dev/null` = "" ]]
|
|
||||||
then
|
|
||||||
echo
|
|
||||||
echo "To use this script you have to install the program \"pnmpsnr\" which is"
|
|
||||||
echo " included in the netpbm package."
|
|
||||||
echo
|
|
||||||
exit=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ `which bc 2> /dev/null` = "" ]]
|
|
||||||
then
|
|
||||||
echo
|
|
||||||
echo "To use this script you have to install the GNU command line calculator \"bc\"."
|
|
||||||
echo
|
|
||||||
exit=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $# -le 1 ]; then
|
|
||||||
echo
|
|
||||||
echo "Usage: `basename $0` <file1> <file2> [<frames>] [<options1>] [<options2>]"
|
|
||||||
echo
|
|
||||||
echo " <file1> and <file2> are the files for which the PSNR should be calculated."
|
|
||||||
echo " [<frames>] is the number of frames to process, starting from frame 1."
|
|
||||||
echo " [<options1>] are additional MPlayer options for <file1>."
|
|
||||||
echo " [<options2>] are additional MPlayer options for <file2>."
|
|
||||||
echo
|
|
||||||
echo " Be aware that `basename $0` needs a lot of temporary space inside /tmp/."
|
|
||||||
echo
|
|
||||||
echo "Example:"
|
|
||||||
echo " ./`basename $0` ./orig.avi ./test.avi 250 \"\" \"-vf pp=ac\""
|
|
||||||
echo
|
|
||||||
|
|
||||||
exit=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$exit" -eq 1 ]; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
FILE1=$1
|
|
||||||
FILE2=$2
|
|
||||||
|
|
||||||
LastFrame=-1
|
|
||||||
if [ $# -ge 3 ]; then
|
|
||||||
LastFrame=$3
|
|
||||||
echo
|
|
||||||
echo "Will process $LastFrame frames."
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $# -ge 4 ]; then
|
|
||||||
FILE1_Options=$4
|
|
||||||
echo "MPlayer options for ${FILE1}: $FILE1_Options"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $# -ge 5 ]; then
|
|
||||||
FILE2_Options=$5
|
|
||||||
echo "MPlayer options for ${FILE2}: $FILE2_Options"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
mkdir -p ${TEMPDIR}/FILE1
|
|
||||||
mkdir -p ${TEMPDIR}/FILE2
|
|
||||||
|
|
||||||
### File 1
|
|
||||||
echo
|
|
||||||
echo "############## $FILE1 #################"
|
|
||||||
|
|
||||||
cd ${TEMPDIR}/FILE1
|
|
||||||
|
|
||||||
rm -f *ppm
|
|
||||||
rm -f *del
|
|
||||||
|
|
||||||
if [ $LastFrame -ge 0 ]; then
|
|
||||||
mplayer $FILE1_Options -frames $LastFrame -nosound -vo pnm ${WORKDIR}/$FILE1 > /dev/null
|
|
||||||
else
|
|
||||||
mplayer $FILE1_Options -nosound -vo pnm ${WORKDIR}/$FILE1 > /dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
### File 2
|
|
||||||
echo
|
|
||||||
echo "############## $FILE2 #################"
|
|
||||||
|
|
||||||
cd ${TEMPDIR}/FILE2
|
|
||||||
|
|
||||||
rm -f *ppm
|
|
||||||
|
|
||||||
if [ $LastFrame -ge 0 ]; then
|
|
||||||
mplayer $FILE2_Options -frames $LastFrame -nosound -vo pnm ${WORKDIR}/$FILE2 > /dev/null
|
|
||||||
else
|
|
||||||
mplayer $FILE2_Options -nosound -vo pnm ${WORKDIR}/$FILE2 > /dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
### PSNR
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "############## PSNR Calculation #################"
|
|
||||||
|
|
||||||
if [[ `ls -1 ${TEMPDIR}/FILE1/*ppm | wc -l` = `ls -1 ${TEMPDIR}/FILE2/*ppm | wc -l` ]]
|
|
||||||
then
|
|
||||||
echo
|
|
||||||
else
|
|
||||||
warning_frame_number
|
|
||||||
echo
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
cd ${TEMPDIR}/FILE2
|
|
||||||
#rm ../$OUTFILE
|
|
||||||
echo "File;Y;Cb;Cr" > ../$OUTFILE
|
|
||||||
echo "0" > $ERRFILE
|
|
||||||
i=0
|
|
||||||
for FILE in `ls -1 *.ppm`
|
|
||||||
do
|
|
||||||
echo $FILE
|
|
||||||
echo -n "$FILE" >> ../$OUTFILE
|
|
||||||
echo -n ";" >> ../$OUTFILE
|
|
||||||
|
|
||||||
YCBCR=`pnmpsnr ../FILE1/$FILE $FILE 2>&1 | tail -n 3 | cut -f 3 -d ':' | \
|
|
||||||
( read Y X; read CB X; read CR X; echo "$Y;$CB;$CR;")`
|
|
||||||
Y=`echo $YCBCR | cut -f 1 -d ';'`
|
|
||||||
CB=`echo $YCBCR | cut -f 2 -d ';'`
|
|
||||||
CR=`echo $YCBCR | cut -f 3 -d ';'`
|
|
||||||
echo $YCBCR >> ../$OUTFILE
|
|
||||||
|
|
||||||
ALL=`echo "(-10)*l((e(-$Y/10*l(10))+e(-$CB/10*l(10))/4+e(-$CR/10*l(10))/4)/1.5)/l(10)" | bc -l`
|
|
||||||
echo "$ALL" >> ../$OUTFILE
|
|
||||||
ERROR=`echo "scale=30; (e(-1*$Y/10*l(10))+e(-1*$CB/10*l(10))/4+e(-1*$CR/10*l(10))/4)/1.5" | bc -l`
|
|
||||||
ERRORSUM=`cat $ERRFILE`
|
|
||||||
echo `echo "scale=30; $ERROR + $ERRORSUM" | bc -l` > $ERRFILE
|
|
||||||
|
|
||||||
i=$(($i+1))
|
|
||||||
if [[ $i = $LastFrame ]]
|
|
||||||
then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
ERRORSUM=`cat $ERRFILE`
|
|
||||||
PSNR=`echo "-10*l($ERRORSUM/$i)/l(10)" | bc -l`
|
|
||||||
echo "PSNR:;$PSNR" >> ../$OUTFILE
|
|
||||||
|
|
||||||
cd ..
|
|
||||||
mv $OUTFILE ${WORKDIR}/
|
|
||||||
|
|
||||||
if [[ `ls -1 ${TEMPDIR}/FILE1/*ppm | wc -l` = `ls -1 ${TEMPDIR}/FILE2/*ppm | wc -l` ]]
|
|
||||||
then
|
|
||||||
echo
|
|
||||||
else
|
|
||||||
warning_frame_number
|
|
||||||
echo
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd ..
|
|
||||||
rm -r ${TEMPDIR}
|
|
||||||
|
|
||||||
echo "Created ${WORKDIR}/$OUTFILE"
|
|
||||||
echo
|
|
445
TOOLS/subedit.pl
445
TOOLS/subedit.pl
@ -1,445 +0,0 @@
|
|||||||
#!/usr/bin/perl -w
|
|
||||||
|
|
||||||
# A script for pipelined editing of subtitle files.
|
|
||||||
# Copyright (C) 2004 Michael Klepikov <mike72@mail.ru>
|
|
||||||
#
|
|
||||||
# Version 1.0 initial release 28-Mar-04
|
|
||||||
#
|
|
||||||
# Comments, suggestions -- send me an mail, but the recommended way is
|
|
||||||
# to enhance/fix on your own and submit to the distribution;)
|
|
||||||
# If you like, I can review the fixes.
|
|
||||||
#
|
|
||||||
# This script is free software; you can redistribute it and/or
|
|
||||||
# modify it under the terms of the GNU Lesser General Public
|
|
||||||
# License as published by the Free Software Foundation; either
|
|
||||||
# version 2.1 of the License, or (at your option) any later version.
|
|
||||||
# Retain original credits when modifying.
|
|
||||||
#
|
|
||||||
# This script is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
# Lesser General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU Lesser General Public
|
|
||||||
# License along with this library; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
#
|
|
||||||
|
|
||||||
use Math::BigInt;
|
|
||||||
|
|
||||||
# Constants
|
|
||||||
my $FMT_UNKNOWN = 0;
|
|
||||||
my $FMT_SRT = 1;
|
|
||||||
|
|
||||||
# Argument values
|
|
||||||
my $DEBUG = 0;
|
|
||||||
my $inFormat;
|
|
||||||
my $outFormat;
|
|
||||||
my $shiftMilli;
|
|
||||||
my $scaleMilli;
|
|
||||||
my $splitFromMilli;
|
|
||||||
my $splitToMilli;
|
|
||||||
|
|
||||||
## Process command line
|
|
||||||
while (defined ($argVal = shift)) {
|
|
||||||
if ($argVal eq "-d" || $argVal eq "--debug") {
|
|
||||||
$DEBUG = 1;
|
|
||||||
} elsif ($argVal eq "-if" || $argVal eq "--input-format") {
|
|
||||||
$inFormat = shift;
|
|
||||||
usage ("Must specify input format") if ! $inFormat;
|
|
||||||
if ($inFormat =~ /^srt/i) {
|
|
||||||
$inFormat = $FMT_SRT;
|
|
||||||
} else {
|
|
||||||
usage ("Invalid input format");
|
|
||||||
}
|
|
||||||
} elsif ($argVal eq "-of" || $argVal eq "--output-format") {
|
|
||||||
$outFormat = shift;
|
|
||||||
usage ("Must specify input format") if ! $outFormat;
|
|
||||||
if ($outFormat =~ /^srt/i) {
|
|
||||||
$outFormat = $FMT_SRT;
|
|
||||||
} else {
|
|
||||||
usage ("Invalid output format");
|
|
||||||
}
|
|
||||||
} elsif ($argVal eq "-s" || $argVal eq "--shift") {
|
|
||||||
my $argTime = shift;
|
|
||||||
if (! defined $argTime ||
|
|
||||||
! defined ($shiftMilli = getTimeMillis ($argTime))) {
|
|
||||||
usage ("Invalid shift time value");
|
|
||||||
}
|
|
||||||
} elsif ($argVal eq "-c" || $argVal eq "--scale") {
|
|
||||||
my $argTime = shift;
|
|
||||||
if (! defined $argTime ||
|
|
||||||
! defined ($scaleMilli = getTimeMillis ($argTime))) {
|
|
||||||
usage ("Invalid scale time value");
|
|
||||||
}
|
|
||||||
} elsif ($argVal eq "-f" || $argVal eq "--split-from") {
|
|
||||||
my $argTime = shift;
|
|
||||||
if (! defined $argTime ||
|
|
||||||
! defined ($splitFromMilli = getTimeMillis ($argTime))) {
|
|
||||||
usage ("Invalid split start time value");
|
|
||||||
}
|
|
||||||
} elsif ($argVal eq "-t" || $argVal eq "--split-to") {
|
|
||||||
my $argTime = shift;
|
|
||||||
if (! defined $argTime ||
|
|
||||||
! defined ($splitToMilli = getTimeMillis ($argTime))) {
|
|
||||||
usage ("Invalid split end time value");
|
|
||||||
}
|
|
||||||
} elsif ($argVal eq "-h" || $argVal eq "--help") {
|
|
||||||
usage ();
|
|
||||||
} else {
|
|
||||||
usage ("Unrecognized argument $argVal");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Input format defaults to SRT
|
|
||||||
$inFormat = $FMT_SRT if (! defined $inFormat);
|
|
||||||
# Output format defaults to the same as input
|
|
||||||
$outFormat = $inFormat if (! defined $outFormat);
|
|
||||||
|
|
||||||
## Read
|
|
||||||
|
|
||||||
my $subs;
|
|
||||||
if ($inFormat == $FMT_SRT) {
|
|
||||||
$subs = readSRT (*STDIN);
|
|
||||||
printf STDERR ("Read %d SRT subs\n", scalar @{$subs}) if $DEBUG;
|
|
||||||
# Sort by start time
|
|
||||||
@{$subs} = sort {$a -> {srtStartTime} <=> $b -> {srtEndTime}} @{$subs};
|
|
||||||
}
|
|
||||||
|
|
||||||
## Transform
|
|
||||||
|
|
||||||
if (defined $shiftMilli && 0 != $shiftMilli) {
|
|
||||||
printf STDERR ("Shift: %d milliseconds\n", $shiftMilli) if $DEBUG;
|
|
||||||
shiftSRT ($subs, $shiftMilli);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (defined $splitFromMilli || defined $splitToMilli) {
|
|
||||||
if ($DEBUG) {
|
|
||||||
my $printFrom = (defined $splitFromMilli) ? $splitFromMilli : "-";
|
|
||||||
my $printTo = (defined $splitToMilli) ? $splitToMilli : "-";
|
|
||||||
printf STDERR ("Split: from $printFrom to $printTo\n");
|
|
||||||
}
|
|
||||||
splitSRT ($subs, $splitFromMilli, $splitToMilli);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (defined $scaleMilli && 0 != $scaleMilli) {
|
|
||||||
my $lastSubIdx = scalar @{$subs} - 1;
|
|
||||||
if ($lastSubIdx >= 0) {
|
|
||||||
my $lastTimeOrig = $subs -> [$lastSubIdx] -> {srtEndTime};
|
|
||||||
if ($lastTimeOrig == 0) {
|
|
||||||
die "Cannot scale when last subtitle ends at 00:00:00,000";
|
|
||||||
}
|
|
||||||
my $lastTimeScaled = $lastTimeOrig + $scaleMilli;
|
|
||||||
printf STDERR ("Scale: %d/%d\n", $lastTimeScaled, $lastTimeOrig) if $DEBUG;
|
|
||||||
scaleSRT ($subs, $lastTimeScaled, $lastTimeOrig);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
## Write
|
|
||||||
if ($outFormat == $FMT_SRT) {
|
|
||||||
writeSRT (*STDOUT, $subs);
|
|
||||||
}
|
|
||||||
|
|
||||||
# Close STDOUT, as recommended by Perl manual
|
|
||||||
# (allows diagnostics on disc overflow, etc.)
|
|
||||||
close (STDOUT) || die "Cannot close output stream: $!";
|
|
||||||
|
|
||||||
exit 0;
|
|
||||||
|
|
||||||
## Subroutines
|
|
||||||
|
|
||||||
# Convert string time format to milliseconds
|
|
||||||
# SRT style: "01:20:03.251", and "," is allowed instead of "."
|
|
||||||
# Return undef in case of format error
|
|
||||||
sub getTimeMillis
|
|
||||||
{
|
|
||||||
$_ = shift;
|
|
||||||
my $millis = 0;
|
|
||||||
|
|
||||||
if (/\s*(.*)[\.,]([0-9]+)?\s*$/) { # Fraction; strip surrounding spaces
|
|
||||||
#print STDERR "frac: \$1=$1 \$2=$2\n" if $DEBUG;
|
|
||||||
$_ = $1;
|
|
||||||
$millis += ("0." . $2) * 1000 if $2;
|
|
||||||
}
|
|
||||||
if (/(.*?)([0-9]+)$/) { # Seconds
|
|
||||||
#print STDERR "secs: \$1=$1 \$2=$2\n" if $DEBUG;
|
|
||||||
$_ = $1;
|
|
||||||
$millis += $2 * 1000 if $2;
|
|
||||||
}
|
|
||||||
if (/(.*?)([0-9]+):$/) { # Minutes
|
|
||||||
#print STDERR "mins: \$1=$1 \$2=$2\n" if $DEBUG;
|
|
||||||
$_ = $1;
|
|
||||||
$millis += $2 * 60000 if $2;
|
|
||||||
}
|
|
||||||
if (/(.*?)([0-9]+):$/) { # Hours
|
|
||||||
#print STDERR "mins: \$1=$1 \$2=$2\n" if $DEBUG;
|
|
||||||
$_ = $1;
|
|
||||||
$millis += $2 * 3600000 if $2;
|
|
||||||
}
|
|
||||||
if (/(.*?)\-$/) { # Minus sign
|
|
||||||
$_ = $1;
|
|
||||||
$millis *= -1;
|
|
||||||
}
|
|
||||||
$millis = undef if (! /^$/); # Make sure we ate everything up
|
|
||||||
if ($DEBUG) {
|
|
||||||
if (defined $millis) {
|
|
||||||
#print STDERR "time value match: $millis ms\n";
|
|
||||||
} else {
|
|
||||||
#print STDERR "time mismatch\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $millis;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Convert milliseconds to SRT formatted string
|
|
||||||
sub getTimeSRT
|
|
||||||
{
|
|
||||||
my $t = shift;
|
|
||||||
my $tMinus = "";
|
|
||||||
if ($t < 0) {
|
|
||||||
$t = -$t;
|
|
||||||
$tMinus = "-";
|
|
||||||
}
|
|
||||||
my $tMilli = $t % 1000;
|
|
||||||
$t /= 1000;
|
|
||||||
my $tSec = $t % 60;
|
|
||||||
$t /= 60;
|
|
||||||
my $tMin = $t % 60;
|
|
||||||
$t /= 60;
|
|
||||||
my $tHr = $t;
|
|
||||||
return sprintf ("%s%02d:%02d:%02d,%03d",
|
|
||||||
$tMinus, $tHr, $tMin, $tSec, $tMilli);
|
|
||||||
}
|
|
||||||
|
|
||||||
# Read SRT subtitles
|
|
||||||
sub readSRT
|
|
||||||
{
|
|
||||||
local *IN = shift;
|
|
||||||
my $subs = [];
|
|
||||||
|
|
||||||
$_ = <IN>;
|
|
||||||
print STDERR "Undefined first line\n" if ! defined $_ && $DEBUG;
|
|
||||||
my $lineNo = 1;
|
|
||||||
READ_SUBS:
|
|
||||||
while (defined $_) {
|
|
||||||
# Each loop iteration reads one subtitle from <IN>
|
|
||||||
my $sub = {};
|
|
||||||
|
|
||||||
# print STDERR "Reading line $lineNo\n" if $DEBUG;
|
|
||||||
|
|
||||||
# Skip empty lines
|
|
||||||
while (/^\s*$/) {
|
|
||||||
last READ_SUBS if ! ($_ = <IN>);
|
|
||||||
++$lineNo;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Subtitle number
|
|
||||||
if (/^\s*([0-9]+)\s*$/) {
|
|
||||||
$sub -> {srtNumber} = $1;
|
|
||||||
# print "SRT num: $1\n" if $DEBUG;
|
|
||||||
} else {
|
|
||||||
die "Invalid SRT format at line $lineNo";
|
|
||||||
}
|
|
||||||
|
|
||||||
# Timing
|
|
||||||
if ($_ = <IN>) {
|
|
||||||
++$lineNo;
|
|
||||||
} else {
|
|
||||||
die "Unexpected end of SRT stream at line $lineNo";
|
|
||||||
}
|
|
||||||
# print STDERR "LINE: $_\n" if $DEBUG;
|
|
||||||
if (/^\s*(\S+)\s*--\>\s*(\S+)\s*$/) {
|
|
||||||
my $startMillis = getTimeMillis ($1);
|
|
||||||
my $endMillis = getTimeMillis ($2);
|
|
||||||
die "Invalid SRT timing format at line $lineNo: $_"
|
|
||||||
if ! defined $startMillis || ! defined $endMillis;
|
|
||||||
$sub -> {srtStartTime} = $startMillis;
|
|
||||||
$sub -> {srtEndTime} = $endMillis;
|
|
||||||
} else {
|
|
||||||
die "Invalid SRT timing format at line $lineNo: $_";
|
|
||||||
}
|
|
||||||
|
|
||||||
# Text lines
|
|
||||||
my $subLines = [];
|
|
||||||
while (1) {
|
|
||||||
last if ! ($_ = <IN>); # EOF ends subtitle
|
|
||||||
++$lineNo;
|
|
||||||
last if /^\s*$/; # Empty line ends subtitle
|
|
||||||
($_ = $_) =~ s/\s+$//; # Strip trailing spaces
|
|
||||||
push @{$subLines}, $_;
|
|
||||||
}
|
|
||||||
die "No text in SRT subtitle at line $lineNo" if 0 == scalar @{$subLines};
|
|
||||||
$sub -> {lines} = $subLines;
|
|
||||||
|
|
||||||
# Append subtitle to the list
|
|
||||||
push @{$subs}, $sub;
|
|
||||||
}
|
|
||||||
print STDERR "SRT read ok, $lineNo lines\n" if $DEBUG;
|
|
||||||
|
|
||||||
return $subs;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Write SRT subtitles
|
|
||||||
sub writeSRT
|
|
||||||
{
|
|
||||||
use integer; # For integer division
|
|
||||||
local *OUT = shift;
|
|
||||||
my $subs = shift;
|
|
||||||
|
|
||||||
my $subNum = 0;
|
|
||||||
foreach (@{$subs}) {
|
|
||||||
++$subNum;
|
|
||||||
|
|
||||||
my $sub = $_;
|
|
||||||
my $sTimeSRT = getTimeSRT ($sub -> {srtStartTime});
|
|
||||||
my $eTimeSRT = getTimeSRT ($sub -> {srtEndTime});
|
|
||||||
printf OUT ("%d\n%s --> %s\n", $subNum, $sTimeSRT, $eTimeSRT);
|
|
||||||
foreach (@{$sub -> {lines}}) {
|
|
||||||
printf OUT ("%s\n", $_);
|
|
||||||
}
|
|
||||||
printf OUT "\n";
|
|
||||||
}
|
|
||||||
printf STDERR ("Wrote %d SRT subs\n", $subNum) if $DEBUG;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Shift SRT subtitles by a given number of seconds.
|
|
||||||
# The number may be negative and fractional.
|
|
||||||
sub shiftSRT
|
|
||||||
{
|
|
||||||
use integer; # $shiftMilli could be passed as float
|
|
||||||
my $subs = shift;
|
|
||||||
my $shiftMilli = shift;
|
|
||||||
|
|
||||||
foreach (@{$subs}) {
|
|
||||||
$_ -> {srtStartTime} += $shiftMilli;
|
|
||||||
$_ -> {srtEndTime} += $shiftMilli;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Multiply each subtitle timing by a divident and divide by divisor.
|
|
||||||
# The idea is that the divident is usually the new total number of
|
|
||||||
# milliseconds in the subtitle file, and the divisor is the old
|
|
||||||
# total number of milliseconds in the subtitle file.
|
|
||||||
# We could simply use a double precision real coefficient instead of
|
|
||||||
# integer divident and divisor, and that could be good enough, but
|
|
||||||
# using integer arithmetics *guarantees* precision up to the last
|
|
||||||
# digit, so why settle for good enough when we can have a guarantee.
|
|
||||||
#
|
|
||||||
# Uses Math::BigInt arithmetics, because it works with numbers
|
|
||||||
# up to (total number of milliseconds for a subtitle timing)^2,
|
|
||||||
# which could be on the order of approximately 1e+13, which is
|
|
||||||
# larger than maximum 32-bit integer.
|
|
||||||
# There is a performance loss when using BigInt vs. regular floating
|
|
||||||
# point arithmetics, but the actual performance is quite acceptable
|
|
||||||
# on files with a few thousand subtitles.
|
|
||||||
sub scaleSRT
|
|
||||||
{
|
|
||||||
use integer; # Divident and divisor could be passed as floats, truncate
|
|
||||||
my $subs = shift;
|
|
||||||
my $scaleDividend = shift;
|
|
||||||
my $scaleDivisor = shift;
|
|
||||||
|
|
||||||
foreach (@{$subs}) {
|
|
||||||
my $ss = Math::BigInt -> new ($_ -> {srtStartTime});
|
|
||||||
$ss = $ss -> bmul ($scaleDividend);
|
|
||||||
$_ -> {srtStartTime} = $ss -> bdiv ($scaleDivisor) -> bsstr ();
|
|
||||||
my $se = Math::BigInt -> new ($_ -> {srtEndTime});
|
|
||||||
$se = $se -> bmul ($scaleDividend);
|
|
||||||
$_ -> {srtEndTime} = $se -> bdiv ($scaleDivisor) -> bsstr ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Extract a fragment within a given time interval
|
|
||||||
# Either "from" or "to" may be undefined
|
|
||||||
sub splitSRT
|
|
||||||
{
|
|
||||||
use integer; # fromMilli and toMilli could be passed as floats, truncate
|
|
||||||
my $subs = shift;
|
|
||||||
my $fromMilli = shift;
|
|
||||||
my $toMilli = shift;
|
|
||||||
|
|
||||||
my $iSub = 0;
|
|
||||||
while ($iSub < scalar @{$subs}) {
|
|
||||||
$_ = $subs -> [$iSub];
|
|
||||||
my $keep = 0;
|
|
||||||
if (! defined $fromMilli || $_ -> {srtEndTime} >= $fromMilli) {
|
|
||||||
# The subtitle ends later than the start boundary
|
|
||||||
|
|
||||||
# Fix overlapping start timing,
|
|
||||||
# but only of the start boundary is not infinite (undef)
|
|
||||||
if (defined $fromMilli && $_ -> {srtStartTime} < $fromMilli) {
|
|
||||||
$_ -> {srtStartTime} = $fromMilli;
|
|
||||||
}
|
|
||||||
if (! defined $toMilli || $_ -> {srtStartTime} <= $toMilli) {
|
|
||||||
# The subtitle begins earlier than the end boundary
|
|
||||||
|
|
||||||
# Fix overlapping end timing,
|
|
||||||
# but only of the end boundary is not infinite (undef)
|
|
||||||
if (defined $toMilli && $_ -> {srtEndTime} > $toMilli) {
|
|
||||||
$_ -> {srtEndTime} = $toMilli;
|
|
||||||
}
|
|
||||||
|
|
||||||
# All conditions met, all fixes done
|
|
||||||
$keep = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($keep) {
|
|
||||||
++$iSub;
|
|
||||||
} else {
|
|
||||||
splice @{$subs}, $iSub, 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Print brief usage help
|
|
||||||
# Accepts an optional error message, e.g. for errors parsing command line
|
|
||||||
sub usage
|
|
||||||
{
|
|
||||||
my $msg = shift;
|
|
||||||
my $exitCode = 0;
|
|
||||||
|
|
||||||
if (defined $msg) {
|
|
||||||
$exitCode = 2;
|
|
||||||
print STDERR "$msg\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
print STDERR <<USAGE;
|
|
||||||
Usage: $0 [switches]
|
|
||||||
-if,--input-format <fmt> input format; supported: SRT
|
|
||||||
default is SRT
|
|
||||||
-of,--output-format <fmt> output format; supported: SRT
|
|
||||||
default is same as input format
|
|
||||||
-s,--shift <time> shift all subtitles by <time>
|
|
||||||
(format: [-]hh:mm:ss,fraction)
|
|
||||||
-c,--scale <time> scale by adding <time> to overall duration
|
|
||||||
-f,--split-from <time> Drop subtitles that end before <time>
|
|
||||||
-t,--split-to <time> Drop subtitles that start after <time>
|
|
||||||
(will truncate timing if it overlaps a boundary)
|
|
||||||
-r,--renumber renumber SRT subtitles in output
|
|
||||||
-d,--debug enable debug output
|
|
||||||
-h,--help this help message
|
|
||||||
|
|
||||||
All times could be negative. Input/output may also contain negative timings,
|
|
||||||
which is sometimes useful for intermediate results.
|
|
||||||
SRT subtitles are always renumbered on output.
|
|
||||||
|
|
||||||
EXAMPLES
|
|
||||||
|
|
||||||
Split subtitle file into two disks at a boundary of one hour 15 minutes:
|
|
||||||
|
|
||||||
subedit.pl --split-to 1:15:0 < all.srt > p1.srt
|
|
||||||
subedit.pl -f 1:15:0 < all.srt | subedit.pl --shift -1:15:0 > p2.srt
|
|
||||||
|
|
||||||
Join the previous two disks back into one file:
|
|
||||||
|
|
||||||
subedit.pl -s 1:15:00 < p2.srt | cat p1.srt - | subedit.pl > all.srt
|
|
||||||
|
|
||||||
Correct a situation where the first subtitle starts in sync with the video,
|
|
||||||
but the last one starts 3.5 seconds earlier than the speech in the video,
|
|
||||||
assuming the first subtitle timing is 00:01:05.030:
|
|
||||||
|
|
||||||
subedit.pl -s -1:5.03 | subedit.pl -c 3.5 | subedit.pl -s 1:5.03
|
|
||||||
USAGE
|
|
||||||
|
|
||||||
exit $exitCode;
|
|
||||||
}
|
|
237
TOOLS/subrip.c
237
TOOLS/subrip.c
@ -1,237 +0,0 @@
|
|||||||
/*
|
|
||||||
* Use with CVS JOCR/GOCR.
|
|
||||||
*
|
|
||||||
* You will have to change 'vobsub_id' value if you want another subtitle than number 0.
|
|
||||||
*
|
|
||||||
* HINT: you can view the subtitle that is being decoded with "display subtitle-*.pgm"
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Make sure this accesses the CVS version of JOCR/GOCR */
|
|
||||||
#define GOCR_PROGRAM "gocr"
|
|
||||||
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include "libvo/video_out.h"
|
|
||||||
#include "sub/vobsub.h"
|
|
||||||
#include "sub/spudec.h"
|
|
||||||
|
|
||||||
/* linking hacks */
|
|
||||||
char *mplayer_version;
|
|
||||||
|
|
||||||
/* XXX Kludge ahead, this MUST be the same as the definitions found in ../spudec.c */
|
|
||||||
typedef struct packet_t packet_t;
|
|
||||||
struct packet_t {
|
|
||||||
unsigned char *packet;
|
|
||||||
unsigned int palette[4];
|
|
||||||
unsigned int alpha[4];
|
|
||||||
unsigned int control_start; /* index of start of control data */
|
|
||||||
unsigned int current_nibble[2]; /* next data nibble (4 bits) to be
|
|
||||||
processed (for RLE decoding) for
|
|
||||||
even and odd lines */
|
|
||||||
int deinterlace_oddness; /* 0 or 1, index into current_nibble */
|
|
||||||
unsigned int start_col, end_col;
|
|
||||||
unsigned int start_row, end_row;
|
|
||||||
unsigned int width, height, stride;
|
|
||||||
unsigned int start_pts, end_pts;
|
|
||||||
packet_t *next;
|
|
||||||
};
|
|
||||||
typedef struct {
|
|
||||||
packet_t *queue_head;
|
|
||||||
packet_t *queue_tail;
|
|
||||||
unsigned int global_palette[16];
|
|
||||||
unsigned int orig_frame_width, orig_frame_height;
|
|
||||||
unsigned char* packet;
|
|
||||||
size_t packet_reserve; /* size of the memory pointed to by packet */
|
|
||||||
unsigned int packet_offset; /* end of the currently assembled fragment */
|
|
||||||
unsigned int packet_size; /* size of the packet once all fragments are assembled */
|
|
||||||
unsigned int packet_pts; /* PTS for this packet */
|
|
||||||
unsigned int palette[4];
|
|
||||||
unsigned int alpha[4];
|
|
||||||
unsigned int cuspal[4];
|
|
||||||
unsigned int custom;
|
|
||||||
unsigned int now_pts;
|
|
||||||
unsigned int start_pts, end_pts;
|
|
||||||
unsigned int start_col, end_col;
|
|
||||||
unsigned int start_row, end_row;
|
|
||||||
unsigned int width, height, stride;
|
|
||||||
size_t image_size; /* Size of the image buffer */
|
|
||||||
unsigned char *image; /* Grayscale value */
|
|
||||||
unsigned char *aimage; /* Alpha value */
|
|
||||||
unsigned int scaled_frame_width, scaled_frame_height;
|
|
||||||
unsigned int scaled_start_col, scaled_start_row;
|
|
||||||
unsigned int scaled_width, scaled_height, scaled_stride;
|
|
||||||
size_t scaled_image_size;
|
|
||||||
unsigned char *scaled_image;
|
|
||||||
unsigned char *scaled_aimage;
|
|
||||||
int auto_palette; /* 1 if we lack a palette and must use an heuristic. */
|
|
||||||
int font_start_level; /* Darkest value used for the computed font */
|
|
||||||
const vo_functions_t *hw_spu;
|
|
||||||
int spu_changed;
|
|
||||||
} spudec_handle_t;
|
|
||||||
|
|
||||||
int vobsub_id=0;
|
|
||||||
int sub_pos=0;
|
|
||||||
|
|
||||||
static spudec_handle_t *spudec;
|
|
||||||
static FILE *fsub = NULL;
|
|
||||||
static unsigned int sub_idx = 0;
|
|
||||||
|
|
||||||
static void
|
|
||||||
process_gocr_output(const char *const fname, unsigned int start, unsigned int end)
|
|
||||||
{
|
|
||||||
FILE *file;
|
|
||||||
int temp, h, m, s, ms;
|
|
||||||
int c, bol;
|
|
||||||
file = fopen(fname, "r");
|
|
||||||
if (file == NULL) {
|
|
||||||
perror("fopen failed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
temp = start;
|
|
||||||
temp /= 90;
|
|
||||||
h = temp / 3600000;
|
|
||||||
temp %= 3600000;
|
|
||||||
m = temp / 60000;
|
|
||||||
temp %= 60000;
|
|
||||||
s = temp / 1000;
|
|
||||||
temp %= 1000;
|
|
||||||
ms = temp;
|
|
||||||
fprintf(fsub, "%d\n%02d:%02d:%02d,%03d --> ", ++sub_idx, h, m, s, ms);
|
|
||||||
temp = end;
|
|
||||||
temp /= 90;
|
|
||||||
h = temp / 3600000;
|
|
||||||
temp %= 3600000;
|
|
||||||
m = temp / 60000;
|
|
||||||
temp %= 60000;
|
|
||||||
s = temp / 1000;
|
|
||||||
temp %= 1000;
|
|
||||||
ms = temp;
|
|
||||||
fprintf(fsub, "%02d:%02d:%02d,%03d\n", h, m, s, ms);
|
|
||||||
bol = 1;
|
|
||||||
while ((c = getc(file)) != EOF) {
|
|
||||||
if (bol) {
|
|
||||||
if (!isspace(c)) {
|
|
||||||
putc(c, fsub);
|
|
||||||
bol=0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (!bol) {
|
|
||||||
putc(c, fsub);
|
|
||||||
bol = c == '\n';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
putc('\n', fsub);
|
|
||||||
fflush(fsub);
|
|
||||||
fclose(file);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
output_pgm(FILE *f, int w, int h, unsigned char *src, unsigned char *srca, int stride)
|
|
||||||
{
|
|
||||||
int x, y;
|
|
||||||
fprintf(f,
|
|
||||||
"P5\n"
|
|
||||||
"%d %d\n"
|
|
||||||
"255\n",
|
|
||||||
w, h);
|
|
||||||
for (y = 0; y < h; ++y) {
|
|
||||||
for (x = 0; x < w; ++x) {
|
|
||||||
int res;
|
|
||||||
if (srca[x])
|
|
||||||
res = src[x] * (256 - srca[x]);
|
|
||||||
else
|
|
||||||
res = 0;
|
|
||||||
res = (65535 - res) >> 8;
|
|
||||||
putc(res&0xff, f);
|
|
||||||
|
|
||||||
}
|
|
||||||
src += stride;
|
|
||||||
srca += stride;
|
|
||||||
}
|
|
||||||
putc('\n', f);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
draw_alpha(int x0, int y0, int w, int h, unsigned char *src, unsigned char *srca, int stride)
|
|
||||||
{
|
|
||||||
FILE *f;
|
|
||||||
char buf[128];
|
|
||||||
char cmd[512];
|
|
||||||
int cmdres;
|
|
||||||
const char *const tmpfname = tmpnam(NULL);
|
|
||||||
sprintf(buf, "subtitle-%d-%d.pgm", spudec->start_pts / 90, spudec->end_pts / 90);
|
|
||||||
f = fopen(buf, "w");
|
|
||||||
output_pgm(f, w, h, src, srca, stride);
|
|
||||||
fclose(f);
|
|
||||||
/* see <URL:http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/subtitleripper/subtitleripper/src/README.gocr?rev=HEAD&content-type=text/vnd.viewcvs-markup> */
|
|
||||||
sprintf(cmd, GOCR_PROGRAM" -v 1 -s 7 -d 0 -m 130 -m 256 -m 32 -i %s -o %s", buf, tmpfname);
|
|
||||||
cmdres = system(cmd);
|
|
||||||
if (cmdres < 0) {
|
|
||||||
perror("system failed");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
else if (cmdres) {
|
|
||||||
fprintf(stderr, GOCR_PROGRAM" returned %d\n", cmdres);
|
|
||||||
exit(cmdres);
|
|
||||||
}
|
|
||||||
process_gocr_output(tmpfname, spudec->start_pts, spudec->end_pts);
|
|
||||||
unlink(buf);
|
|
||||||
unlink(tmpfname);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
const char *vobsubname, *subripname;
|
|
||||||
void *vobsub;
|
|
||||||
void *packet;
|
|
||||||
int packet_len;
|
|
||||||
unsigned int pts100;
|
|
||||||
|
|
||||||
if (argc < 2 || 4 < argc) {
|
|
||||||
fprintf(stderr, "Usage: %s <vobsub basename> [<subid> [<output filename>] ]\n", argv[0]);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
vobsubname = argv[1];
|
|
||||||
subripname = NULL;
|
|
||||||
fsub = stdout;
|
|
||||||
if (argc >= 3)
|
|
||||||
vobsub_id = atoi(argv[2]);
|
|
||||||
if (argc >= 4) {
|
|
||||||
subripname = argv[3];
|
|
||||||
fsub = fopen(subripname, "w");
|
|
||||||
}
|
|
||||||
|
|
||||||
vobsub = vobsub_open(vobsubname, NULL, 0, &spudec);
|
|
||||||
while ((packet_len=vobsub_get_next_packet(vobsub, &packet, &pts100)) >= 0) {
|
|
||||||
spudec_assemble(spudec, packet, packet_len, pts100);
|
|
||||||
if (spudec->queue_head) {
|
|
||||||
spudec_heartbeat(spudec, spudec->queue_head->start_pts);
|
|
||||||
if (spudec_changed(spudec))
|
|
||||||
spudec_draw(spudec, draw_alpha);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vobsub)
|
|
||||||
vobsub_close(vobsub);
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# Collects all the appropriate subtitle files in a given directory and
|
|
||||||
# its subdirectories, no matter what the filename is.
|
|
||||||
# Use this together as: mplayer -sub `subsearch.sh` movie
|
|
||||||
# Author: Alex
|
|
||||||
#
|
|
||||||
|
|
||||||
[ $1 ] && cd `dirname $1`
|
|
||||||
|
|
||||||
_sub_names=""
|
|
||||||
|
|
||||||
one_dir_search() {
|
|
||||||
for i in $dir/*
|
|
||||||
do
|
|
||||||
case "`echo $i | tr [:upper:] [:lower:]`" in
|
|
||||||
*.sub|*.srt|*.mps|*.txt) _sub_names="$i,$_sub_names" ;;
|
|
||||||
*) ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
dir="."
|
|
||||||
one_dir_search
|
|
||||||
|
|
||||||
# add subdirectories too
|
|
||||||
for dir in *
|
|
||||||
do
|
|
||||||
[ -d $dir ] && one_dir_search
|
|
||||||
done
|
|
||||||
|
|
||||||
_len="`echo $_sub_names | wc -c`"
|
|
||||||
_len=$((_len-2))
|
|
||||||
echo $_sub_names | cut -b -"$_len"
|
|
304
TOOLS/vfw2menc.c
304
TOOLS/vfw2menc.c
@ -1,304 +0,0 @@
|
|||||||
/*
|
|
||||||
* VFW Compressor Settings Tool
|
|
||||||
*
|
|
||||||
* Copyright (c) 2006 Gianluigi Tiesi <sherpya@netfarm.it>
|
|
||||||
*
|
|
||||||
* Official Website : http://oss.netfarm.it/mplayer-win32.php
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this program; if not, write to the the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* On MinGW compile with: gcc vfw2menc.c -o vfw2menc.exe -lwinmm -lole32 */
|
|
||||||
/* Using Wine: winegcc vfw2menc.c -o vfw2menc -lwinmm -lole32 */
|
|
||||||
/* MSVC requires getopt.c and getopt.h available at the original website */
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#define _CRT_SECURE_NO_DEPRECATE
|
|
||||||
#pragma warning(disable: 4996)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define VERSION "0.1"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <getopt.h>
|
|
||||||
#include <windows.h>
|
|
||||||
#include <vfw.h>
|
|
||||||
|
|
||||||
#define BAIL(msg) { printf("%s: %s\n", argv[0], msg); ret = -1; goto cleanup; }
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
UINT uDriverSignature;
|
|
||||||
HINSTANCE hDriverModule;
|
|
||||||
DRIVERPROC DriverProc;
|
|
||||||
DWORD dwDriverID;
|
|
||||||
} DRVR;
|
|
||||||
|
|
||||||
typedef DRVR *PDRVR;
|
|
||||||
typedef DRVR *NPDRVR;
|
|
||||||
typedef DRVR *LPDRVR;
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
MODE_NONE = 0,
|
|
||||||
MODE_CHECK,
|
|
||||||
MODE_SAVE,
|
|
||||||
MODE_VIEW
|
|
||||||
};
|
|
||||||
|
|
||||||
static int save_settings(HDRVR hDriver, const char *filename)
|
|
||||||
{
|
|
||||||
FILE *fd = NULL;
|
|
||||||
DWORD cb = (DWORD) SendDriverMessage(hDriver, ICM_GETSTATE, 0, 0);
|
|
||||||
char *pv = NULL;
|
|
||||||
|
|
||||||
if (!cb)
|
|
||||||
{
|
|
||||||
printf("ICM_GETSTATE returned 0 size\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pv = malloc(cb);
|
|
||||||
if (SendDriverMessage(hDriver, ICM_GETSTATE, (LPARAM) pv, (LPARAM) &cb) != ICERR_OK)
|
|
||||||
{
|
|
||||||
printf("ICM_GETSTATE failed\n");
|
|
||||||
free(pv);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
fd = fopen(filename, "wb");
|
|
||||||
if (!fd)
|
|
||||||
{
|
|
||||||
printf("Cannot open file %s for writing\n", filename);
|
|
||||||
free(pv);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fwrite(pv, cb, 1, fd) != 1)
|
|
||||||
{
|
|
||||||
printf("fwrite() failed on %s\n", filename);
|
|
||||||
free(pv);
|
|
||||||
fclose(fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
fclose(fd);
|
|
||||||
free(pv);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int load_settings(HDRVR hDriver, const char *filename)
|
|
||||||
{
|
|
||||||
struct stat info;
|
|
||||||
FILE *fd = NULL;
|
|
||||||
char *pv;
|
|
||||||
|
|
||||||
if (stat(filename, &info) < 0)
|
|
||||||
{
|
|
||||||
printf("stat() on %s failed\n", filename);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pv = malloc(info.st_size);
|
|
||||||
fd = fopen(filename, "rb");
|
|
||||||
|
|
||||||
if (!fd)
|
|
||||||
{
|
|
||||||
printf("Cannot open file %s for reading\n", filename);
|
|
||||||
free(pv);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fread(pv, info.st_size, 1, fd) != 1)
|
|
||||||
{
|
|
||||||
printf("fread() failed on %s\n", filename);
|
|
||||||
free(pv);
|
|
||||||
fclose(fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
fclose(fd);
|
|
||||||
if (!SendDriverMessage(hDriver, ICM_SETSTATE, (LPARAM) pv, (LPARAM) info.st_size))
|
|
||||||
{
|
|
||||||
printf("ICM_SETSTATE failed\n");
|
|
||||||
free(pv);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
free(pv);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct option long_options[] =
|
|
||||||
{
|
|
||||||
{ "help", no_argument, NULL, 'h' },
|
|
||||||
{ "driver", required_argument, NULL, 'd' },
|
|
||||||
{ "fourcc", required_argument, NULL, 'f' },
|
|
||||||
{ "save", required_argument, NULL, 's' },
|
|
||||||
{ "check", required_argument, NULL, 'c' },
|
|
||||||
{ "view", no_argument, NULL, 'v' },
|
|
||||||
{ 0, 0, 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static void help(const char *progname)
|
|
||||||
{
|
|
||||||
printf("VFW to mencoder v"VERSION" - Copyright 2007 - Gianluigi Tiesi <sherpya@netfarm.it>\n");
|
|
||||||
printf("This program is Free Software\n\n");
|
|
||||||
printf("Usage: %s\n", progname);
|
|
||||||
printf(" -h|--help - displays this help\n");
|
|
||||||
printf(" -d|--driver filename - dll or drv to load\n");
|
|
||||||
printf(" -f|--fourcc fourcc - fourcc of selected driver (look at codecs.conf)\n");
|
|
||||||
printf(" -s|--save filename - save settings to file\n");
|
|
||||||
printf(" -c|--check filename - load and show setting in filename\n");
|
|
||||||
printf(" -v|--view - displays the config dialog and do nothing\n");
|
|
||||||
printf("\nExamples:\n");
|
|
||||||
printf(" %s -f VP62 -d vp6vfw.dll -s firstpass.mcf\n", progname);
|
|
||||||
printf(" %s -f VP62 -d vp6vfw.dll -c firstpass.mcf\n", progname);
|
|
||||||
printf(" %s -f VP62 -d vp6vfw.dll -v\n", progname);
|
|
||||||
printf("\nIf the driver dialog doesn't work, you can try without specifing a fourcc,\n");
|
|
||||||
printf("but the compdata file will not work with mencoder.\n");
|
|
||||||
printf("Driver option is required and you must specify at least -s, -c -o -v\n");
|
|
||||||
printf("Usage with mencoder -ovc vfw -xvfwopts codec=vp6vfw.dll:compdata=settings.mcf\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
char *driver = NULL;
|
|
||||||
char *fourcc = NULL;
|
|
||||||
char *filename = NULL;
|
|
||||||
unsigned char mode = 0;
|
|
||||||
DWORD dwFCC = 0;
|
|
||||||
ICOPEN icopen;
|
|
||||||
HRESULT coinit = -1;
|
|
||||||
/* ICINFO icinfo; */
|
|
||||||
|
|
||||||
wchar_t drvfile[MAX_PATH];
|
|
||||||
HDRVR hDriver = NULL;
|
|
||||||
int ret = 0;
|
|
||||||
int c = -1, long_options_index = -1;
|
|
||||||
|
|
||||||
if (argc < 2)
|
|
||||||
{
|
|
||||||
help(argv[0]);
|
|
||||||
ret = -1;
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((c = getopt_long(argc, argv, "hd:f:s:c:v", long_options, &long_options_index)) != -1)
|
|
||||||
{
|
|
||||||
switch (c)
|
|
||||||
{
|
|
||||||
case 'h':
|
|
||||||
help(argv[0]);
|
|
||||||
ret = 0;
|
|
||||||
goto cleanup;
|
|
||||||
case 'd':
|
|
||||||
driver = strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 'f':
|
|
||||||
fourcc = strdup(optarg);
|
|
||||||
if (strlen(optarg) != 4) BAIL("Fourcc must be exactly 4 chars");
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
if (mode != MODE_NONE) BAIL("Incompatible arguments");
|
|
||||||
filename = strdup(optarg);
|
|
||||||
mode = MODE_SAVE;
|
|
||||||
break;
|
|
||||||
case 'c':
|
|
||||||
if (mode != MODE_NONE) BAIL("Incompatible arguments");
|
|
||||||
filename = strdup(optarg);
|
|
||||||
mode = MODE_CHECK;
|
|
||||||
break;
|
|
||||||
case 'v':
|
|
||||||
if (mode != MODE_NONE) BAIL("Incompatible arguments");
|
|
||||||
mode = MODE_VIEW;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
printf("Wrong arguments!\n");
|
|
||||||
help(argv[0]);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(argc == optind) && (mode != MODE_NONE) &&
|
|
||||||
driver && (filename || (mode == MODE_VIEW)))
|
|
||||||
{
|
|
||||||
help(argv[0]);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!MultiByteToWideChar(CP_ACP, 0, driver, -1, drvfile, MAX_PATH))
|
|
||||||
BAIL("MultiByteToWideChar() failed\n");
|
|
||||||
|
|
||||||
if (fourcc) memcpy(&dwFCC, fourcc, 4);
|
|
||||||
memset(&icopen, 0, sizeof(icopen));
|
|
||||||
|
|
||||||
icopen.dwSize = sizeof(icopen);
|
|
||||||
icopen.fccType = ICTYPE_VIDEO; /* VIDC */
|
|
||||||
icopen.fccHandler = dwFCC;
|
|
||||||
icopen.dwVersion = 0x00001000; /* FIXME */
|
|
||||||
icopen.dwFlags = ICMODE_COMPRESS;
|
|
||||||
icopen.dwError = 0;
|
|
||||||
icopen.pV1Reserved = NULL;
|
|
||||||
icopen.pV2Reserved = NULL;
|
|
||||||
icopen.dnDevNode = -1; /* FIXME */
|
|
||||||
|
|
||||||
coinit = CoInitialize(NULL);
|
|
||||||
|
|
||||||
if (!(hDriver = OpenDriver(drvfile, NULL, (LPARAM) &icopen)))
|
|
||||||
BAIL("OpenDriver() failed\n");
|
|
||||||
|
|
||||||
/*
|
|
||||||
memset(&icinfo, 0, sizeof(ICINFO));
|
|
||||||
icinfo.dwSize = sizeof(ICINFO);
|
|
||||||
SendDriverMessage(hDriver, ICM_GETINFO, (LPARAM) &icinfo, sizeof(ICINFO));
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (SendDriverMessage(hDriver, ICM_CONFIGURE, -1, 0) != ICERR_OK)
|
|
||||||
BAIL("The driver doesn't provide a configure dialog");
|
|
||||||
|
|
||||||
|
|
||||||
switch(mode)
|
|
||||||
{
|
|
||||||
case MODE_CHECK:
|
|
||||||
if (load_settings(hDriver, filename))
|
|
||||||
BAIL("Cannot load settings from file");
|
|
||||||
if (SendDriverMessage(hDriver, ICM_CONFIGURE, 0, 0) != ICERR_OK)
|
|
||||||
BAIL("ICM_CONFIGURE failed");
|
|
||||||
break;
|
|
||||||
case MODE_SAVE:
|
|
||||||
if (SendDriverMessage(hDriver, ICM_CONFIGURE, 0, 0) != ICERR_OK)
|
|
||||||
BAIL("ICM_CONFIGURE failed");
|
|
||||||
if (save_settings(hDriver, filename))
|
|
||||||
BAIL("Cannot save settings to file");
|
|
||||||
break;
|
|
||||||
case MODE_VIEW:
|
|
||||||
{
|
|
||||||
HWND hwnd = GetDesktopWindow();
|
|
||||||
if (SendDriverMessage(hDriver, ICM_CONFIGURE, (LPARAM) hwnd, 0) != ICERR_OK)
|
|
||||||
BAIL("ICM_CONFIGURE failed");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
BAIL("This should not happen :)");
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
free(driver);
|
|
||||||
free(fourcc);
|
|
||||||
free(filename);
|
|
||||||
if (hDriver) CloseDriver(hDriver, 0, 0);
|
|
||||||
if ((coinit == S_OK) || coinit == S_FALSE) CoUninitialize();
|
|
||||||
return ret;
|
|
||||||
}
|
|
314
TOOLS/vivodump.c
314
TOOLS/vivodump.c
@ -1,314 +0,0 @@
|
|||||||
/*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
|
|
||||||
#include "loader/wine/mmreg.h"
|
|
||||||
#include "loader/wine/vfw.h"
|
|
||||||
|
|
||||||
#include "stream/stream.h"
|
|
||||||
#include "libmpdemux/muxer.h"
|
|
||||||
#include "libmpdemux/demuxer.h"
|
|
||||||
|
|
||||||
/* linking hacks */
|
|
||||||
char *info_name;
|
|
||||||
char *info_artist;
|
|
||||||
char *info_genre;
|
|
||||||
char *info_subject;
|
|
||||||
char *info_copyright;
|
|
||||||
char *info_sourceform;
|
|
||||||
char *info_comment;
|
|
||||||
|
|
||||||
char* out_filename = NULL;
|
|
||||||
char* force_fourcc=NULL;
|
|
||||||
char* passtmpfile="divx2pass.log";
|
|
||||||
|
|
||||||
static const short h263_format[8][2] = {
|
|
||||||
{ 0, 0 },
|
|
||||||
{ 128, 96 },
|
|
||||||
{ 176, 144 },
|
|
||||||
{ 352, 288 },
|
|
||||||
{ 704, 576 },
|
|
||||||
{ 1408, 1152 },
|
|
||||||
{ 320, 240 }
|
|
||||||
};
|
|
||||||
|
|
||||||
unsigned char* buffer;
|
|
||||||
int bufptr=0;
|
|
||||||
int bitcnt=0;
|
|
||||||
unsigned char buf=0;
|
|
||||||
|
|
||||||
static unsigned int x_get_bits(int n){
|
|
||||||
unsigned int x=0;
|
|
||||||
while(n-->0){
|
|
||||||
if(!bitcnt){
|
|
||||||
// fill buff
|
|
||||||
buf=buffer[bufptr++];
|
|
||||||
bitcnt=8;
|
|
||||||
}
|
|
||||||
//x=(x<<1)|(buf&1);buf>>=1;
|
|
||||||
x=(x<<1)|(buf>>7);buf<<=1;
|
|
||||||
--bitcnt;
|
|
||||||
}
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define get_bits(xxx,n) x_get_bits(n)
|
|
||||||
#define get_bits1(xxx) x_get_bits(1)
|
|
||||||
#define skip_bits(xxx,n) x_get_bits(n)
|
|
||||||
#define skip_bits1(xxx) x_get_bits(1)
|
|
||||||
|
|
||||||
int format;
|
|
||||||
int width=320;
|
|
||||||
int height=240;
|
|
||||||
|
|
||||||
/* most is hardcoded. should extend to handle all h263 streams */
|
|
||||||
static int h263_decode_picture_header(unsigned char *b_ptr)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for(i=0;i<16;i++) printf(" %02X",b_ptr[i]); printf("\n");
|
|
||||||
|
|
||||||
buffer=b_ptr;
|
|
||||||
bufptr=bitcnt=buf=0;
|
|
||||||
|
|
||||||
/* picture header */
|
|
||||||
if (get_bits(&s->gb, 22) != 0x20){
|
|
||||||
printf("bad picture header\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
skip_bits(&s->gb, 8); /* picture timestamp */
|
|
||||||
|
|
||||||
if (get_bits1(&s->gb) != 1){
|
|
||||||
printf("bad marker\n");
|
|
||||||
return -1; /* marker */
|
|
||||||
}
|
|
||||||
if (get_bits1(&s->gb) != 0){
|
|
||||||
printf("bad h263 id\n");
|
|
||||||
return -1; /* h263 id */
|
|
||||||
}
|
|
||||||
skip_bits1(&s->gb); /* split screen off */
|
|
||||||
skip_bits1(&s->gb); /* camera off */
|
|
||||||
skip_bits1(&s->gb); /* freeze picture release off */
|
|
||||||
|
|
||||||
format = get_bits(&s->gb, 3);
|
|
||||||
|
|
||||||
if (format != 7) {
|
|
||||||
printf("h263_plus = 0 format = %d\n",format);
|
|
||||||
/* H.263v1 */
|
|
||||||
width = h263_format[format][0];
|
|
||||||
height = h263_format[format][1];
|
|
||||||
printf("%d x %d\n",width,height);
|
|
||||||
// if (!width) return -1;
|
|
||||||
|
|
||||||
printf("pict_type=%d\n",get_bits1(&s->gb));
|
|
||||||
printf("unrestricted_mv=%d\n",get_bits1(&s->gb));
|
|
||||||
#if 1
|
|
||||||
printf("SAC: %d\n",get_bits1(&s->gb));
|
|
||||||
printf("advanced prediction mode: %d\n",get_bits1(&s->gb));
|
|
||||||
printf("PB frame: %d\n",get_bits1(&s->gb));
|
|
||||||
#else
|
|
||||||
if (get_bits1(&s->gb) != 0)
|
|
||||||
return -1; /* SAC: off */
|
|
||||||
if (get_bits1(&s->gb) != 0)
|
|
||||||
return -1; /* advanced prediction mode: off */
|
|
||||||
if (get_bits1(&s->gb) != 0)
|
|
||||||
return -1; /* not PB frame */
|
|
||||||
#endif
|
|
||||||
printf("qscale=%d\n",get_bits(&s->gb, 5));
|
|
||||||
skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
|
|
||||||
} else {
|
|
||||||
printf("h263_plus = 1\n");
|
|
||||||
/* H.263v2 */
|
|
||||||
if (get_bits(&s->gb, 3) != 1){
|
|
||||||
printf("H.263v2 A error\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (get_bits(&s->gb, 3) != 6){ /* custom source format */
|
|
||||||
printf("custom source format\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
skip_bits(&s->gb, 12);
|
|
||||||
skip_bits(&s->gb, 3);
|
|
||||||
printf("pict_type=%d\n",get_bits(&s->gb, 3) + 1);
|
|
||||||
// if (s->pict_type != I_TYPE &&
|
|
||||||
// s->pict_type != P_TYPE)
|
|
||||||
// return -1;
|
|
||||||
skip_bits(&s->gb, 7);
|
|
||||||
skip_bits(&s->gb, 4); /* aspect ratio */
|
|
||||||
width = (get_bits(&s->gb, 9) + 1) * 4;
|
|
||||||
skip_bits1(&s->gb);
|
|
||||||
height = get_bits(&s->gb, 9) * 4;
|
|
||||||
printf("%d x %d\n",width,height);
|
|
||||||
//if (height == 0)
|
|
||||||
// return -1;
|
|
||||||
printf("qscale=%d\n",get_bits(&s->gb, 5));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* PEI */
|
|
||||||
while (get_bits1(&s->gb) != 0) {
|
|
||||||
skip_bits(&s->gb, 8);
|
|
||||||
}
|
|
||||||
// s->f_code = 1;
|
|
||||||
// s->width = width;
|
|
||||||
// s->height = height;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int postable[32768];
|
|
||||||
|
|
||||||
int main(int argc,char ** argv){
|
|
||||||
int c;
|
|
||||||
FILE *f;
|
|
||||||
FILE *f2;
|
|
||||||
muxer_t* avi;
|
|
||||||
muxer_stream_t* mux;
|
|
||||||
//unsigned char* buffer=malloc(0x200000);
|
|
||||||
int i,len;
|
|
||||||
int v_id=0;
|
|
||||||
int flag2=0;
|
|
||||||
int prefix=0;
|
|
||||||
|
|
||||||
// check if enough args were given
|
|
||||||
if ( argc < 3 ){
|
|
||||||
printf("Too few arguments given!\n"
|
|
||||||
"Usage: %s <input_file> <output_file>\n", argv[0]);
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
// input
|
|
||||||
if(!(f=fopen(argv[1],"rb"))){
|
|
||||||
printf("Couldn't open input file.\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
// output
|
|
||||||
if(!(f2=fopen(argv[2],"wb"))){
|
|
||||||
printf("Couldn't open output file.\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
avi=muxer_new_muxer(MUXER_TYPE_AVI,f2);
|
|
||||||
mux=muxer_new_stream(avi,MUXER_TYPE_VIDEO);
|
|
||||||
|
|
||||||
mux->buffer_size=0x200000;
|
|
||||||
mux->buffer=malloc(mux->buffer_size);
|
|
||||||
|
|
||||||
mux->h.dwScale=1;
|
|
||||||
mux->h.dwRate=10;
|
|
||||||
|
|
||||||
mux->bih=malloc(sizeof(*mux->bih));
|
|
||||||
mux->bih->biSize=sizeof(*mux->bih);
|
|
||||||
mux->bih->biPlanes=1;
|
|
||||||
mux->bih->biBitCount=24;
|
|
||||||
mux->bih->biCompression=0x6f766976;// 7669766f;
|
|
||||||
muxer_write_header(avi);
|
|
||||||
|
|
||||||
/*
|
|
||||||
c=fgetc(f); if(c) printf("error! not vivo file?\n");
|
|
||||||
len=0;
|
|
||||||
while((c=fgetc(f))>=0x80) len+=0x80*(c&0x0F);
|
|
||||||
len+=c;
|
|
||||||
printf("hdr1: %d\n",len);
|
|
||||||
for(i=0;i<len;i++) fgetc(f);
|
|
||||||
*/
|
|
||||||
|
|
||||||
while((c=fgetc(f))>=0){
|
|
||||||
|
|
||||||
printf("%08lX %02X\n",ftell(f),c);
|
|
||||||
|
|
||||||
prefix=0;
|
|
||||||
if(c==0x82){
|
|
||||||
prefix=1;
|
|
||||||
//continue;
|
|
||||||
c=fgetc(f);
|
|
||||||
printf("%08lX %02X\n",ftell(f),c);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(c==0x00){
|
|
||||||
// header
|
|
||||||
int len=0;
|
|
||||||
while((c=fgetc(f))>=0x80) len+=0x80*(c&0x0F);
|
|
||||||
len+=c;
|
|
||||||
printf("header: 00 (%d)\n",len);
|
|
||||||
for(i=0;i<len;i++) fgetc(f);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if((c&0xF0)==0x40){
|
|
||||||
// audio
|
|
||||||
len=24;
|
|
||||||
if(prefix) len=fgetc(f);
|
|
||||||
printf("audio: %02X (%d)\n",c,len);
|
|
||||||
for(i=0;i<len;i++) fgetc(f);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if((c&0xF0)==0x30){
|
|
||||||
// audio
|
|
||||||
len=40;
|
|
||||||
if(prefix) len=fgetc(f);
|
|
||||||
printf("audio: %02X (%d)\n",c,len);
|
|
||||||
for(i=0;i<len;i++) fgetc(f);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if(flag2 || (((c&0xF0)==0x10 || (c&0xF0)==0x20) && (c&0x0F)!=(v_id&0xF))){
|
|
||||||
// end of frame:
|
|
||||||
printf("Frame size: %d\n",mux->buffer_len);
|
|
||||||
h263_decode_picture_header(mux->buffer);
|
|
||||||
muxer_write_chunk(mux,mux->buffer_len,0x10, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
|
|
||||||
mux->buffer_len=0;
|
|
||||||
|
|
||||||
if((v_id&0xF0)==0x10) fprintf(stderr,"hmm. last video packet %02X\n",v_id);
|
|
||||||
}
|
|
||||||
flag2=0;
|
|
||||||
if((c&0xF0)==0x10){
|
|
||||||
// 128 byte
|
|
||||||
len=128;
|
|
||||||
if(prefix) len=fgetc(f);
|
|
||||||
printf("video: %02X (%d)\n",c,len);
|
|
||||||
fread(mux->buffer+mux->buffer_len,len,1,f);
|
|
||||||
mux->buffer_len+=len;
|
|
||||||
v_id=c;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if((c&0xF0)==0x20){
|
|
||||||
int len=fgetc(f);
|
|
||||||
printf("video: %02X (%d)\n",c,len);
|
|
||||||
fread(mux->buffer+mux->buffer_len,len,1,f);
|
|
||||||
mux->buffer_len+=len;
|
|
||||||
flag2=1;
|
|
||||||
v_id=c;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
printf("error: %02X!\n",c);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!width) width=320;
|
|
||||||
if(!height) height=240;
|
|
||||||
|
|
||||||
mux->bih->biWidth=width;
|
|
||||||
mux->bih->biHeight=height;
|
|
||||||
mux->bih->biSizeImage=3*width*height;
|
|
||||||
|
|
||||||
muxer_write_index(avi);
|
|
||||||
fseek(f2,0,SEEK_SET);
|
|
||||||
muxer_write_header(avi);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
#usage:
|
|
||||||
#
|
|
||||||
# vobshift.py in.idx out.idx -8.45
|
|
||||||
#
|
|
||||||
# this will read in in.idx,shift it by 8.45 seconds back,
|
|
||||||
# and save it as out.idx
|
|
||||||
#
|
|
||||||
# license: i don't care ;)
|
|
||||||
#
|
|
||||||
|
|
||||||
import datetime
|
|
||||||
import sys
|
|
||||||
|
|
||||||
def tripletize(line):
|
|
||||||
begin = line[:11]
|
|
||||||
middle = line[11:23]
|
|
||||||
end = line[23:]
|
|
||||||
return (begin,middle,end)
|
|
||||||
|
|
||||||
def text2delta(t):
|
|
||||||
h = int( t[0:2] )
|
|
||||||
m = int( t[3:5] )
|
|
||||||
s = int( t[6:8] )
|
|
||||||
milli = int( t[9:12] )
|
|
||||||
return datetime.timedelta(hours=h,minutes=m,seconds=s,milliseconds=milli)
|
|
||||||
|
|
||||||
def delta2text(d):
|
|
||||||
t = str(d)
|
|
||||||
milli = t[8:11]
|
|
||||||
if len(milli) == 0: #fix for .000 seconds
|
|
||||||
milli = '000'
|
|
||||||
return '0'+t[:7]+':'+milli
|
|
||||||
|
|
||||||
def shift(line,seconds):
|
|
||||||
triplet = tripletize(line)
|
|
||||||
|
|
||||||
base = text2delta(triplet[1])
|
|
||||||
base = base + datetime.timedelta(seconds=seconds)
|
|
||||||
base = delta2text(base)
|
|
||||||
|
|
||||||
return triplet[0]+base+triplet[2]
|
|
||||||
|
|
||||||
INFILE =sys.argv[1]
|
|
||||||
OUTFILE =sys.argv[2]
|
|
||||||
DIFF =float(sys.argv[3])
|
|
||||||
|
|
||||||
o = open(OUTFILE,'wt')
|
|
||||||
|
|
||||||
|
|
||||||
for line in open(INFILE):
|
|
||||||
if line.startswith('timestamp'):
|
|
||||||
line = shift(line,DIFF)
|
|
||||||
|
|
||||||
o.write(line)
|
|
||||||
|
|
||||||
o.close()
|
|
@ -1,168 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
## usage: w32codec_dl.pl (codec.conf location)
|
|
||||||
|
|
||||||
# this script will use MS's codec dl interface as used by MS Media Player
|
|
||||||
# to attempt to locate the codecs listed in codecs.conf. It will download
|
|
||||||
# them to a directory "codecs/" below the current dir.
|
|
||||||
# you will need the libwww-perl stuff and the utility "cabextract"
|
|
||||||
# which may be found at http://www.kyz.uklinux.net/cabextract.php3
|
|
||||||
|
|
||||||
# By Tom Lees, 2002. I hereby place this script into the public domain.
|
|
||||||
|
|
||||||
#use LWP::Debug qw(+);
|
|
||||||
use LWP::UserAgent;
|
|
||||||
|
|
||||||
$ua = LWP::UserAgent->new;
|
|
||||||
$ua->agent ("Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)");
|
|
||||||
|
|
||||||
# Parse the etc/codecs.conf file
|
|
||||||
my $cconf = $ARGV[0];
|
|
||||||
open CCONF, "<$cconf";
|
|
||||||
|
|
||||||
my $codec = "(none)";
|
|
||||||
my $mscodec = 0;
|
|
||||||
|
|
||||||
my $cc, @ccl;
|
|
||||||
|
|
||||||
mkdir "codecs";
|
|
||||||
chdir "codecs";
|
|
||||||
|
|
||||||
CC: while (<CCONF>)
|
|
||||||
{
|
|
||||||
next CC if (m/^[ \t]*\;/);
|
|
||||||
s/\;.*//g;
|
|
||||||
s/#.*//g;
|
|
||||||
|
|
||||||
if (m/^videocodec (.*)/)
|
|
||||||
{
|
|
||||||
$codec = $1;
|
|
||||||
}
|
|
||||||
elsif (m/^[ \t]+driver (.*)/)
|
|
||||||
{
|
|
||||||
if ($1 eq "dshow" || $1 eq "vfw")
|
|
||||||
{
|
|
||||||
$mscodec = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$mscodec = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
elsif (m/^[ \t]+fourcc (.*)/ && $mscodec == 1)
|
|
||||||
{
|
|
||||||
$cclist = $1;
|
|
||||||
chomp $cclist;
|
|
||||||
#@ccl = ();
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if ($cclist =~ m/\"(....)\"[, ]*(.*)/)
|
|
||||||
{
|
|
||||||
$cc = $1;
|
|
||||||
$cclist = $2;
|
|
||||||
}
|
|
||||||
elsif ($cclist =~ m/[, ]*(....)[, ]*(.*)/)
|
|
||||||
{
|
|
||||||
$cc = $1;
|
|
||||||
$cclist = $2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$cc = $cclist;
|
|
||||||
$cclist = "";
|
|
||||||
}
|
|
||||||
if (!($cc =~ m/^[ \t]+/))
|
|
||||||
{
|
|
||||||
push @ccl, ($cc);
|
|
||||||
}
|
|
||||||
} while (length ($cclist) > 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close CCONF;
|
|
||||||
|
|
||||||
# Find the codecs
|
|
||||||
open CODEC_CABS, ">codecs.locations.info";
|
|
||||||
%fcc_try = ();
|
|
||||||
while ($#ccl > 0)
|
|
||||||
{
|
|
||||||
$cc = pop (@ccl);
|
|
||||||
if (!$fcc_try{"$cc"})
|
|
||||||
{
|
|
||||||
$fcc_try{"$cc"} = 1;
|
|
||||||
if (!find_codec ($cc))
|
|
||||||
{
|
|
||||||
print "$cc found\n";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
print "MS didn't find $cc\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close CODEC_CABS;
|
|
||||||
|
|
||||||
%got_codecs = ();
|
|
||||||
sub find_codec
|
|
||||||
{
|
|
||||||
my ($fourcc) = @_;
|
|
||||||
|
|
||||||
my $guid = sprintf ("%08X", unpack ("V", $fourcc))."-0000-0010-8000-00AA00389B71";
|
|
||||||
|
|
||||||
my $req = HTTP::Request->new (POST => "http://activex.microsoft.com/objects/ocget.dll");
|
|
||||||
$req->header ('Accept', '*/*');
|
|
||||||
$req->content_type ('application/x-www-form-urlencoded');
|
|
||||||
$req->content ("CLSID=%7B${guid}%7D\n");
|
|
||||||
#$req->content ('CLSID={'.${guid}.'}');
|
|
||||||
|
|
||||||
my $res = $ua->request ($req);
|
|
||||||
|
|
||||||
if ($res->is_success) {
|
|
||||||
print "Lookup returned success... weird!\n";
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
# Codec location
|
|
||||||
if ($res->code == 302)
|
|
||||||
{
|
|
||||||
my $loc = $res->headers->header ("Location");
|
|
||||||
if (!$got_codecs{"$loc"})
|
|
||||||
{
|
|
||||||
print CODEC_CABS "$loc\n";
|
|
||||||
$got_codecs{"$loc"} = 1;
|
|
||||||
get_codec ($loc);
|
|
||||||
}
|
|
||||||
# else
|
|
||||||
# {
|
|
||||||
# print "Already have $loc\n";
|
|
||||||
# }
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
# print "Lookup failed (Microsoft probably doesn't know this codec)\n";
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub get_codec
|
|
||||||
{
|
|
||||||
my ($url) = @_;
|
|
||||||
|
|
||||||
my $req = HTTP::Request->new (GET => $url);
|
|
||||||
$req->header ("Accept", "*/*");
|
|
||||||
my $res = $ua->request ($req);
|
|
||||||
|
|
||||||
if ($res->is_success)
|
|
||||||
{
|
|
||||||
open TMP, ">tmp.cab" or die "Unable to open tmp.cab";
|
|
||||||
print TMP $res->content;
|
|
||||||
close TMP;
|
|
||||||
|
|
||||||
system "cabextract tmp.cab";
|
|
||||||
unlink "tmp.cab";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
print "No such file!\n";
|
|
||||||
}
|
|
||||||
}
|
|
340
TOOLS/wma2ogg.pl
340
TOOLS/wma2ogg.pl
@ -1,340 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
#################################
|
|
||||||
# wma converter 0.3.6 for Linux #
|
|
||||||
#################################
|
|
||||||
|
|
||||||
# Made by Peter Simon <simon.peter@linuxuser.hu>
|
|
||||||
# License: GNU GPL
|
|
||||||
#
|
|
||||||
# Needed programs:
|
|
||||||
#
|
|
||||||
# Getopt::Long - Perl Module
|
|
||||||
# MPlayer - http://www.mplayerhq.hu
|
|
||||||
# BladeEnc - http://bladeenc.mp3.no
|
|
||||||
# oggenc - http://www.vorbis.com
|
|
||||||
# mp3info - http://www.ibiblio.org/mp3info
|
|
||||||
|
|
||||||
# changelog:
|
|
||||||
# 0.1.0
|
|
||||||
# decoding all files to wav without any switches and encoders
|
|
||||||
# 0.2.0
|
|
||||||
# converting to mp3 or ogg with bitrate, delete options
|
|
||||||
# 0.2.1
|
|
||||||
# L.A.M.E. support for fanatics
|
|
||||||
# Default output filetype: ogg
|
|
||||||
# Some error warnings
|
|
||||||
# 0.3.0
|
|
||||||
# Reading the wma tags out and puting into the mp3 or the ogg tags. (What the MPlayer shows of those.)
|
|
||||||
# Default output bitrate: the original bitrate
|
|
||||||
# Simlink for the default encode mode (wma2ogg = ogg, wma2mp3 = mp3)
|
|
||||||
# 0.3.1
|
|
||||||
# Neglecting missing encoders if those are not in use.
|
|
||||||
# 0.3.2
|
|
||||||
# Using mp3info for the mp3 tags
|
|
||||||
# 0.3.3
|
|
||||||
# Convert more then one files in the start dir.
|
|
||||||
# 0.3.4-5
|
|
||||||
# Some bugfixes.
|
|
||||||
# 0.3.6
|
|
||||||
# Some bugfixes by Diego Biurrun
|
|
||||||
|
|
||||||
# Why BladeEnc?
|
|
||||||
# Eg.: The L.A.M.E.'s code isn't compatible for some hardwer-decoders. Makes noise and clashings.
|
|
||||||
# I never met this trouble using BladeEnc.
|
|
||||||
# That's it.
|
|
||||||
|
|
||||||
use Getopt::Long qw(:config pass_through);
|
|
||||||
|
|
||||||
$ver="0.3.6";
|
|
||||||
|
|
||||||
GetOptions("help|?",\&showhelp, 'a' => \$all, "file|f=s" => \@files,"t=s" => \$mtype, "lame" => \$needlame, "del" => \$delete, "br=i" => \$sbrate);
|
|
||||||
|
|
||||||
if (@ARGV) {
|
|
||||||
foreach (@ARGV) {
|
|
||||||
error ("Missing parameter after the $_ switch!");
|
|
||||||
}
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
print "wma2ogg $ver\nPeter Simon <simon.peter\@linuxuser.hu>";
|
|
||||||
|
|
||||||
if (!$all && !@files) {
|
|
||||||
error ("There is no selected file!");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($0 =~/wma2mp3/ && !$mtype) {
|
|
||||||
$mtype="mp3";
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($mtype eq "ogg") {
|
|
||||||
$ttype{"ogg"}="oggenc";
|
|
||||||
needed_prgs (oggenc, "http://www.vorbis.com");
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($needlame && $mtype eq "ogg") {
|
|
||||||
error ("\nYou can not use L.A.M.E. & oggenc together!\n");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$mtype && !$needlame) {
|
|
||||||
$mtype="ogg";
|
|
||||||
$ttype{"ogg"}="oggenc";
|
|
||||||
needed_prgs (oggenc, "http://www.vorbis.com");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (!$needlame && $mtype eq "mp3") {
|
|
||||||
$ttype{"mp3"}="BladeEnc";
|
|
||||||
needed_prgs (BladeEnc, "http://bladeenc.mp3.no", mp3info, "http://www.ibiblio.org/mp3info");
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($needlame) {
|
|
||||||
$mtype="mp3";
|
|
||||||
$ttype{"mp3"}="lame";
|
|
||||||
needed_prgs (lame, "http://lame.sourceforge.net", mp3info, "http://www.ibiblio.org/mp3info");
|
|
||||||
}
|
|
||||||
|
|
||||||
# Main program
|
|
||||||
print "\nUsing lame - WARNING - this is not optimal!\n";
|
|
||||||
ch_needed ();
|
|
||||||
ch_type ();
|
|
||||||
ch_files ();
|
|
||||||
decode();
|
|
||||||
# the end.
|
|
||||||
|
|
||||||
|
|
||||||
sub ch_type {
|
|
||||||
$o_type=$ttype{$mtype};
|
|
||||||
|
|
||||||
if ($mtype ne "wav") {
|
|
||||||
$def_path=$ENV{PATH};
|
|
||||||
@exec_path=split /\:/, $def_path;
|
|
||||||
foreach $temp_path (@exec_path) {
|
|
||||||
if (-d $temp_path && !$enc_ok) {
|
|
||||||
$enc_ok=`find $temp_path -name $o_type -type f -maxdepth 1 2>/dev/null`;
|
|
||||||
chomp ($enc_ok);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((!$o_type || !$enc_ok) && $mtype ne "wav") {
|
|
||||||
error("Unknown encoder.");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub ch_br {
|
|
||||||
if ($sbrate && ((($sbrate <32 || $sbrate>350) && $mtype eq "mp3") || (($sbrate<64 || $sbrate>500) && $mtype eq "ogg") )) {
|
|
||||||
error("Invalid, missing or redundant bitrate.");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub ch_files {
|
|
||||||
if ($all && @files) {
|
|
||||||
error ("You can't use -a switch and -f together!");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($all) {
|
|
||||||
@enc_files=`ls | grep '.wma'\$`;
|
|
||||||
foreach (@enc_files) {
|
|
||||||
chomp $_;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (@files) {
|
|
||||||
@enc_files=@files;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
sub showhelp {
|
|
||||||
print "\n\nUsage: wma2ogg [OPTIONS] (-f FILE1 | -f FILE2 ... | -a)\n
|
|
||||||
-f, -file filename
|
|
||||||
-a converts all wma files in the current directory\n
|
|
||||||
OPTIONS:
|
|
||||||
-t output filetype (ogg, mp3) [default=ogg]
|
|
||||||
-lame I wanna use L.A.M.E. sure enough!
|
|
||||||
-br bitrate (kb/s) [default=from the wma]
|
|
||||||
-del remove wma file(s) after the transcoding\n";
|
|
||||||
print $miss_text;
|
|
||||||
print "\n$errtext\nExiting program.\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
sub error {
|
|
||||||
$errtext=@_[0];
|
|
||||||
showhelp ();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
sub missing_prg {
|
|
||||||
$what=$keys;
|
|
||||||
$that=$needed{$keys};
|
|
||||||
$miss_text.="\nThe needed \'$what\' program is missing, see: $that!";
|
|
||||||
}
|
|
||||||
|
|
||||||
sub ch_needed {
|
|
||||||
|
|
||||||
`perl -e 'use Getopt::Long;' 2>./err`;
|
|
||||||
open (FILE, "<./err");
|
|
||||||
while ($sor=<FILE>) {
|
|
||||||
if ($sor =~ /Can\'t locate/) {
|
|
||||||
missing_prg ("Getopt::Long", ": your Perl is too old... (uhhh... get a new one!)");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`rm ./err`;
|
|
||||||
|
|
||||||
|
|
||||||
foreach $keys (keys %needed) {
|
|
||||||
`$keys 2>./err`;
|
|
||||||
open (FILE, "<./err");
|
|
||||||
while ($sor=<FILE>) {
|
|
||||||
if ($sor =~ /$keys\: command not found/) {
|
|
||||||
missing_prg ();
|
|
||||||
$error=1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`rm ./err`;
|
|
||||||
}
|
|
||||||
|
|
||||||
close FILE;
|
|
||||||
if ($error) {
|
|
||||||
showhelp ();
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub get_tags {
|
|
||||||
my $outfile;
|
|
||||||
open (FILE, "<./1");
|
|
||||||
while ($sor=<FILE>) {
|
|
||||||
$outfile.=$sor;
|
|
||||||
}
|
|
||||||
close FILE;
|
|
||||||
|
|
||||||
$outfile=~ s/\((\d+\,\d+)\ kbit\)/$1/e;
|
|
||||||
print "\noriginal bitrate: $1";
|
|
||||||
$kept_orig_brate=$1;
|
|
||||||
$kept_orig_brate=~ s/(\d+)/$1/e;
|
|
||||||
$kept_orig_brate=$1;
|
|
||||||
|
|
||||||
if (!$sbrate) {
|
|
||||||
$brate=$kept_orig_brate;
|
|
||||||
print " (kept as default)";
|
|
||||||
} else {
|
|
||||||
$brate=$sbrate;
|
|
||||||
print " (new: $brate,0)";
|
|
||||||
}
|
|
||||||
|
|
||||||
ch_br ();
|
|
||||||
|
|
||||||
`rm ./1`;
|
|
||||||
my @temp_info=split /Clip\ info\:/, $outfile;
|
|
||||||
my @temp2_info=split /\n/, @temp_info[1];
|
|
||||||
my @temp_title=split /\ /, $temp2_info[1],3;
|
|
||||||
my @temp_author=split /\ /, $temp2_info[2],3;
|
|
||||||
my @temp_copyright=split /\ /, $temp2_info[3],3;
|
|
||||||
my @temp_comments=split /\ /, $temp2_info[4],3;
|
|
||||||
return ($temp_title[2], $temp_author[2], $temp_copyright[2], $temp2_comments[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub needed_prgs {
|
|
||||||
%needed=(
|
|
||||||
$_[0]=>$_[1],
|
|
||||||
$_[2]=>$_[3],
|
|
||||||
mplayer=>"http://www.mplayerhq.hu",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub mp3_info {
|
|
||||||
if ($title) {
|
|
||||||
$infofile=" -t '$title'";
|
|
||||||
}
|
|
||||||
if ($author) {
|
|
||||||
$infofile.=" -a '$author'";
|
|
||||||
}
|
|
||||||
if ($comments) {
|
|
||||||
$infofile.=" -c '$comments'";
|
|
||||||
}
|
|
||||||
|
|
||||||
`mp3info "$p_name.$mtype" $infofile`;
|
|
||||||
|
|
||||||
undef ($infofile);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
sub decode {
|
|
||||||
foreach (@enc_files) {
|
|
||||||
$wav_name=$_;
|
|
||||||
$wav_name=~ s/(.+)\./$1/e;
|
|
||||||
$p_name=$1;
|
|
||||||
$wav_name=$p_name.".wav";
|
|
||||||
$pwd=`pwd`;
|
|
||||||
chomp $pwd;
|
|
||||||
$pwd.="/t2";
|
|
||||||
print "\nConverting $_ to \"wav\" file.\n";
|
|
||||||
print "Using MPlayer...\n";
|
|
||||||
|
|
||||||
`mplayer "$_" -ao pcm -input conf="$pwd" 2>/dev/null >./1`;
|
|
||||||
`mv "audiodump.wav" "$wav_name"`;
|
|
||||||
|
|
||||||
@tags=get_tags ();
|
|
||||||
|
|
||||||
$title=$tags[0];
|
|
||||||
print "\ntitle: $title";
|
|
||||||
$author=$tags[1];
|
|
||||||
print "\nauthor: $author";
|
|
||||||
$copyright=$tags[2];
|
|
||||||
print "\ncopyright: $copyright";
|
|
||||||
$comments=$tags[3];
|
|
||||||
print "\ncomments: $comments";
|
|
||||||
|
|
||||||
$comments=$copyright." ".$comments."Transcoded by wma2ogg";
|
|
||||||
|
|
||||||
print "\n\nConverting $wav_name to \"$mtype\" file.";
|
|
||||||
|
|
||||||
print "\nUsing $o_type...";
|
|
||||||
|
|
||||||
if ($mtype eq "ogg") {
|
|
||||||
$br_sw="b";
|
|
||||||
if ($title) {
|
|
||||||
$infofile=" -t '$title'";
|
|
||||||
}
|
|
||||||
if ($author) {
|
|
||||||
$infofile.=" -a '$author'";
|
|
||||||
}
|
|
||||||
if ($comments) {
|
|
||||||
$infofile.=" -c COMMENT='$comments'";
|
|
||||||
}
|
|
||||||
|
|
||||||
`"$o_type" "-$br_sw" "$brate" "-Q" "./$wav_name" $infofile "-o" "$p_name.$mtype"`;
|
|
||||||
`rm -f "$wav_name"`;
|
|
||||||
}
|
|
||||||
if ($mtype eq "mp3" && !$needlame) {
|
|
||||||
$br_sw="br";
|
|
||||||
`"$o_type" "$wav_name" "$p_name.$mtype" "-$br_sw" "$brate" 2>/dev/null >/dev/null`;
|
|
||||||
|
|
||||||
mp3_info ();
|
|
||||||
|
|
||||||
`rm -f "$wav_name"`;
|
|
||||||
}
|
|
||||||
if ($mtype eq "mp3" && $needlame) {
|
|
||||||
|
|
||||||
$br_sw="b";
|
|
||||||
`"$o_type" "-$br_sw" "$brate" "-f" "$wav_name" "$p_name.$mtype" 2>/dev/null >/dev/null`;
|
|
||||||
|
|
||||||
mp3_info ();
|
|
||||||
|
|
||||||
`rm -f "$wav_name"`;
|
|
||||||
}
|
|
||||||
if ($delete) {
|
|
||||||
`rm -f "$_"`;
|
|
||||||
}
|
|
||||||
if (-e "./err") {
|
|
||||||
`rm ./err`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print "\n\nDone.\n\n";
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user