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:
Moritz Bunkus 2003-02-24 12:31:17 +00:00
parent fe65e487e5
commit 925b391d8e
5 changed files with 73 additions and 82 deletions

View File

@ -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@

View File

@ -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))

View File

@ -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;

View File

@ -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
View File

@ -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