mirror of
https://gitlab.com/mbunkus/mkvtoolnix.git
synced 2025-02-26 08:22:31 +00:00
added support for external WAV files. Still crashes the mplayer playback, but I do not know which part to blame.
This commit is contained in:
parent
fe65e487e5
commit
925b391d8e
@ -12,12 +12,14 @@ mkvmerge_SOURCES = mkvmerge.cpp mkvmerge.h \
|
||||
mp3_common.cpp mp3_common.h \
|
||||
p_ac3.cpp p_ac3.h \
|
||||
p_mp3.cpp p_mp3.h \
|
||||
p_pcm.cpp p_pcm.h \
|
||||
p_video.cpp p_video.h \
|
||||
pr_generic.h pr_generic.cpp \
|
||||
queue.cpp queue.h \
|
||||
r_ac3.cpp r_ac3.h \
|
||||
r_avi.cpp r_avi.h \
|
||||
r_mp3.cpp r_mp3.h
|
||||
r_mp3.cpp r_mp3.h \
|
||||
r_wav.cpp r_wav.h
|
||||
|
||||
#mkvmerge_LDADD = @OGG_LIBS@ @VORBIS_LIBS@ @VORBISENC_LIBS@ @AVILIB_LIBS@ \
|
||||
# @DMALLOC_LIBS@ @PROFILING_LIBS@ @MATROSKA_LIBS@
|
||||
|
26
mkvmerge.cpp
26
mkvmerge.cpp
@ -13,7 +13,7 @@
|
||||
|
||||
/*!
|
||||
\file
|
||||
\version \$Id: mkvmerge.cpp,v 1.11 2003/02/23 23:23:10 mosu Exp $
|
||||
\version \$Id: mkvmerge.cpp,v 1.12 2003/02/24 12:31:17 mosu Exp $
|
||||
\brief command line parameter parsing, looping, output handling
|
||||
\author Moritz Bunkus <moritz @ bunkus.org>
|
||||
*/
|
||||
@ -53,6 +53,7 @@
|
||||
#include "r_ac3.h"
|
||||
#include "r_avi.h"
|
||||
#include "r_mp3.h"
|
||||
#include "r_wav.h"
|
||||
|
||||
#ifdef DMALLOC
|
||||
#include <dmalloc.h>
|
||||
@ -103,8 +104,8 @@ file_type_t file_types[] =
|
||||
{"demultiplexers:", -1, ""},
|
||||
// {"ogg", TYPEOGM, "general OGG media stream, Vorbis audio embedded in OGG"},
|
||||
{"avi", TYPEAVI, "AVI (Audio/Video Interleaved)"},
|
||||
// {"wav", TYPEWAV, "WAVE (uncompressed PCM)"},
|
||||
// {"srt", TYPEWAV, "SRT text subtitles"},
|
||||
{"wav", TYPEWAV, "WAVE (uncompressed PCM)"},
|
||||
// {"srt", TYPESRT, "SRT text subtitles"},
|
||||
// {" ", TYPEMICRODVD, "MicroDVD text subtitles"},
|
||||
// {"idx", TYPEVOBSUB, "VobSub subtitles"},
|
||||
{"mp3", TYPEMP3, "MPEG1 layer III audio (CBR and VBR/ABR)"},
|
||||
@ -185,8 +186,8 @@ static int get_type(char *filename) {
|
||||
}
|
||||
if (avi_reader_c::probe_file(f, size))
|
||||
return TYPEAVI;
|
||||
// else if (wav_reader_c::probe_file(f, size))
|
||||
// return TYPEWAV;
|
||||
else if (wav_reader_c::probe_file(f, size))
|
||||
return TYPEWAV;
|
||||
// else if (ogm_reader_c::probe_file(f, size))
|
||||
// return TYPEOGM;
|
||||
// else if (srt_reader_c::probe_file(f, size))
|
||||
@ -624,14 +625,13 @@ static void parse_args(int argc, char **argv) {
|
||||
file->reader = new avi_reader_c(file->name, astreams, vstreams,
|
||||
&async, &range, fourcc);
|
||||
break;
|
||||
// case TYPEWAV:
|
||||
// if ((astreams != NULL) || (vstreams != NULL) ||
|
||||
// (tstreams != NULL))
|
||||
// fprintf(stderr, "Warning: -a/-A/-d/-D/-t/-T are ignored for " \
|
||||
// "WAVE files.\n");
|
||||
// file->reader = new wav_reader_c(file->name, &async, &range,
|
||||
// comments);
|
||||
// break;
|
||||
case TYPEWAV:
|
||||
if ((astreams != NULL) || (vstreams != NULL) ||
|
||||
(tstreams != NULL))
|
||||
fprintf(stderr, "Warning: -a/-A/-d/-D/-t/-T are ignored for " \
|
||||
"WAVE files.\n");
|
||||
file->reader = new wav_reader_c(file->name, &async, &range);
|
||||
break;
|
||||
// case TYPESRT:
|
||||
// if ((astreams != NULL) || (vstreams != NULL) ||
|
||||
// (tstreams != NULL))
|
||||
|
@ -13,7 +13,7 @@
|
||||
|
||||
/*!
|
||||
\file
|
||||
\version \$Id: pr_generic.cpp,v 1.1 2003/02/21 09:26:40 mosu Exp $
|
||||
\version \$Id: pr_generic.cpp,v 1.2 2003/02/24 12:31:17 mosu Exp $
|
||||
\brief functions common for all readers/packetizers
|
||||
\author Moritz Bunkus <moritz @ bunkus.org>
|
||||
*/
|
||||
@ -23,6 +23,7 @@
|
||||
#include "pr_generic.h"
|
||||
|
||||
generic_packetizer_c::generic_packetizer_c() {
|
||||
serialno = -1;
|
||||
track_entry = NULL;
|
||||
private_data = NULL;
|
||||
private_data_size = 0;
|
||||
|
72
r_wav.cpp
72
r_wav.cpp
@ -1,36 +1,39 @@
|
||||
/*
|
||||
ogmmerge -- utility for splicing together ogg bitstreams
|
||||
mkvmerge -- utility for splicing together matroska files
|
||||
from component media subtypes
|
||||
|
||||
r_wav.cpp
|
||||
WAVE demultiplexer module (supports raw / uncompressed PCM audio only,
|
||||
type 0x0001)
|
||||
r_mp3.h
|
||||
|
||||
Written by Moritz Bunkus <moritz@bunkus.org>
|
||||
Based on Xiph.org's 'oggmerge' found in their CVS repository
|
||||
See http://www.xiph.org
|
||||
|
||||
Distributed under the GPL
|
||||
see the file COPYING for details
|
||||
or visit http://www.gnu.org/copyleft/gpl.html
|
||||
*/
|
||||
|
||||
/*!
|
||||
\file
|
||||
\version \$Id: r_wav.cpp,v 1.2 2003/02/24 12:31:17 mosu Exp $
|
||||
\brief MP3 reader module
|
||||
\author Moritz Bunkus <moritz @ bunkus.org>
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <ogg/ogg.h>
|
||||
#include "common.h"
|
||||
#include "error.h"
|
||||
#include "mkvmerge.h"
|
||||
#include "queue.h"
|
||||
#include "r_wav.h"
|
||||
#include "p_pcm.h"
|
||||
|
||||
extern "C" {
|
||||
#include <avilib.h> // for wave_header
|
||||
}
|
||||
|
||||
#include "ogmmerge.h"
|
||||
#include "ogmstreams.h"
|
||||
#include "queue.h"
|
||||
#include "r_wav.h"
|
||||
|
||||
#ifdef DMALLOC
|
||||
#include <dmalloc.h>
|
||||
#endif
|
||||
@ -54,7 +57,7 @@ int wav_reader_c::probe_file(FILE *file, u_int64_t size) {
|
||||
}
|
||||
|
||||
wav_reader_c::wav_reader_c(char *fname, audio_sync_t *nasync,
|
||||
range_t *nrange, char **ncomments) throw (error_c) {
|
||||
range_t *nrange) throw (error_c) {
|
||||
u_int64_t size;
|
||||
|
||||
if ((file = fopen(fname, "r")) == NULL)
|
||||
@ -74,10 +77,11 @@ wav_reader_c::wav_reader_c(char *fname, audio_sync_t *nasync,
|
||||
if (chunk == NULL)
|
||||
die("malloc");
|
||||
bytes_processed = 0;
|
||||
pcmpacketizer = new pcm_packetizer_c(wheader.common.dwSamplesPerSec,
|
||||
pcmpacketizer = new pcm_packetizer_c(NULL, 0,
|
||||
wheader.common.dwSamplesPerSec,
|
||||
wheader.common.wChannels,
|
||||
wheader.common.wBitsPerSample, nasync,
|
||||
nrange, ncomments);
|
||||
nrange);
|
||||
if (verbose)
|
||||
fprintf(stderr, "Using WAV demultiplexer for %s.\n+-> Using " \
|
||||
"PCM output module for audio stream.\n", fname);
|
||||
@ -95,23 +99,16 @@ wav_reader_c::~wav_reader_c() {
|
||||
int wav_reader_c::read() {
|
||||
int nread, last_frame;
|
||||
|
||||
if (pcmpacketizer->page_available())
|
||||
if (pcmpacketizer->packet_available())
|
||||
return EMOREDATA;
|
||||
|
||||
nread = fread(chunk, 1, bps, file);
|
||||
if (nread <= 0) {
|
||||
/*
|
||||
* In case that the WAVE header is not set correctly or any other error
|
||||
* occurs. The 'normal' end-of-stream should be handled by comparing the
|
||||
* number of bytes read to the WAVE header fields.
|
||||
*/
|
||||
*chunk = 0;
|
||||
pcmpacketizer->process((char *)chunk, 1, 1);
|
||||
pcmpacketizer->flush_pages();
|
||||
if (nread <= 0)
|
||||
return 0;
|
||||
}
|
||||
|
||||
last_frame = 0;
|
||||
if ((bytes_processed + nread) >= (wheader.riff.len - sizeof(wave_header) + 8))
|
||||
if ((bytes_processed + nread) >=
|
||||
(wheader.riff.len - sizeof(wave_header) + 8))
|
||||
last_frame = 1;
|
||||
pcmpacketizer->process((char *)chunk, nread, last_frame);
|
||||
bytes_processed += nread;
|
||||
@ -122,26 +119,18 @@ int wav_reader_c::read() {
|
||||
return EMOREDATA;
|
||||
}
|
||||
|
||||
int wav_reader_c::serial_in_use(int serial) {
|
||||
return pcmpacketizer->serial_in_use(serial);
|
||||
}
|
||||
|
||||
ogmmerge_page_t *wav_reader_c::get_header_page(int header_type) {
|
||||
return pcmpacketizer->get_header_page(header_type);
|
||||
}
|
||||
|
||||
ogmmerge_page_t *wav_reader_c::get_page() {
|
||||
return pcmpacketizer->get_page();
|
||||
packet_t *wav_reader_c::get_packet() {
|
||||
return pcmpacketizer->get_packet();
|
||||
}
|
||||
|
||||
int wav_reader_c::display_priority() {
|
||||
return DISPLAYPRIORITY_HIGH - 1;
|
||||
}
|
||||
|
||||
void wav_reader_c::reset() {
|
||||
if (pcmpacketizer != NULL)
|
||||
pcmpacketizer->reset();
|
||||
}
|
||||
// void wav_reader_c::reset() {
|
||||
// if (pcmpacketizer != NULL)
|
||||
// pcmpacketizer->reset();
|
||||
// }
|
||||
|
||||
void wav_reader_c::display_progress() {
|
||||
int samples = (wheader.riff.len - sizeof(wheader) + 8) / bps;
|
||||
@ -150,4 +139,3 @@ void wav_reader_c::display_progress() {
|
||||
(int)(bytes_processed * 100L / bps / samples));
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
|
50
r_wav.h
50
r_wav.h
@ -1,35 +1,38 @@
|
||||
/*
|
||||
ogmmerge -- utility for splicing together ogg bitstreams
|
||||
mkvmerge -- utility for splicing together matroska files
|
||||
from component media subtypes
|
||||
|
||||
r_wav.h
|
||||
class definitions for the WAVE demultiplexer module
|
||||
|
||||
Written by Moritz Bunkus <moritz@bunkus.org>
|
||||
Based on Xiph.org's 'oggmerge' found in their CVS repository
|
||||
See http://www.xiph.org
|
||||
|
||||
Distributed under the GPL
|
||||
see the file COPYING for details
|
||||
or visit http://www.gnu.org/copyleft/gpl.html
|
||||
*/
|
||||
|
||||
#ifndef __R_WAV_H__
|
||||
#define __R_WAV_H__
|
||||
/*!
|
||||
\file
|
||||
\version \$Id: r_wav.h,v 1.2 2003/02/24 12:31:17 mosu Exp $
|
||||
\brief class definitions for the WAV reader module
|
||||
\author Moritz Bunkus <moritz @ bunkus.org>
|
||||
*/
|
||||
|
||||
#ifndef __R_WAV_H
|
||||
#define __R_WAV_H
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <ogg/ogg.h>
|
||||
|
||||
extern "C" {
|
||||
#include <avilib.h>
|
||||
}
|
||||
|
||||
#include "ogmmerge.h"
|
||||
#include "common.h"
|
||||
#include "error.h"
|
||||
#include "queue.h"
|
||||
|
||||
#include "p_pcm.h"
|
||||
|
||||
extern "C" {
|
||||
#include "avilib.h"
|
||||
}
|
||||
|
||||
class wav_reader_c: public generic_reader_c {
|
||||
private:
|
||||
unsigned char *chunk;
|
||||
@ -40,21 +43,18 @@ class wav_reader_c: public generic_reader_c {
|
||||
u_int64_t bytes_processed;
|
||||
|
||||
public:
|
||||
wav_reader_c(char *fname, audio_sync_t *nasync, range_t *nrange,
|
||||
char **ncomments) throw (error_c);
|
||||
wav_reader_c(char *fname, audio_sync_t *nasync, range_t *nrange)
|
||||
throw (error_c);
|
||||
virtual ~wav_reader_c();
|
||||
|
||||
virtual int read();
|
||||
virtual int serial_in_use(int);
|
||||
virtual ogmmerge_page_t *get_page();
|
||||
virtual ogmmerge_page_t *get_header_page(int header_type =
|
||||
PACKET_TYPE_HEADER);
|
||||
virtual int read();
|
||||
virtual packet_t *get_packet();
|
||||
|
||||
virtual void reset();
|
||||
virtual int display_priority();
|
||||
virtual void display_progress();
|
||||
/* virtual void reset(); */
|
||||
virtual int display_priority();
|
||||
virtual void display_progress();
|
||||
|
||||
static int probe_file(FILE *file, u_int64_t size);
|
||||
static int probe_file(FILE *file, u_int64_t size);
|
||||
};
|
||||
|
||||
#endif /* __R_WAV_H__*/
|
||||
#endif // __R_WAV_H
|
||||
|
Loading…
Reference in New Issue
Block a user