Converted track_info_t into a class and unified the duplication/freeing of its data.

This commit is contained in:
Moritz Bunkus 2003-12-04 14:36:24 +00:00
parent b2d9833f2b
commit adeda19e26
52 changed files with 304 additions and 302 deletions

View File

@ -69,7 +69,7 @@ int aac_reader_c::probe_file(mm_io_c *mm_io, int64_t size) {
#define INITCHUNKSIZE 16384 #define INITCHUNKSIZE 16384
#define SINITCHUNKSIZE "16384" #define SINITCHUNKSIZE "16384"
aac_reader_c::aac_reader_c(track_info_t *nti) throw (error_c): aac_reader_c::aac_reader_c(track_info_c *nti) throw (error_c):
generic_reader_c(nti) { generic_reader_c(nti) {
int adif, i; int adif, i;
aac_header_t aacheader; aac_header_t aacheader;

View File

@ -41,7 +41,7 @@ private:
bool emphasis_present; bool emphasis_present;
public: public:
aac_reader_c(track_info_t *nti) throw (error_c); aac_reader_c(track_info_c *nti) throw (error_c);
virtual ~aac_reader_c(); virtual ~aac_reader_c();
virtual int read(generic_packetizer_c *ptzr); virtual int read(generic_packetizer_c *ptzr);

View File

@ -62,7 +62,7 @@ int ac3_reader_c::probe_file(mm_io_c *mm_io, int64_t size) {
return 1; return 1;
} }
ac3_reader_c::ac3_reader_c(track_info_t *nti) throw (error_c): ac3_reader_c::ac3_reader_c(track_info_c *nti) throw (error_c):
generic_reader_c(nti) { generic_reader_c(nti) {
int pos; int pos;
ac3_header_t ac3header; ac3_header_t ac3header;

View File

@ -40,7 +40,7 @@ private:
int64_t bytes_processed, size; int64_t bytes_processed, size;
public: public:
ac3_reader_c(track_info_t *nti) throw (error_c); ac3_reader_c(track_info_c *nti) throw (error_c);
virtual ~ac3_reader_c(); virtual ~ac3_reader_c();
virtual int read(generic_packetizer_c *ptzr); virtual int read(generic_packetizer_c *ptzr);

View File

@ -72,7 +72,7 @@ private:
int video_done, maxframes, is_divx, rederive_keyframes; int video_done, maxframes, is_divx, rederive_keyframes;
public: public:
avi_reader_c(track_info_t *nti) throw (error_c); avi_reader_c(track_info_c *nti) throw (error_c);
virtual ~avi_reader_c(); virtual ~avi_reader_c();
virtual int read(generic_packetizer_c *ptzr); virtual int read(generic_packetizer_c *ptzr);

View File

@ -53,7 +53,7 @@ int dts_reader_c::probe_file(mm_io_c *mm_io, int64_t size) {
return 1; return 1;
} }
dts_reader_c::dts_reader_c(track_info_t *nti) throw (error_c): dts_reader_c::dts_reader_c(track_info_c *nti) throw (error_c):
generic_reader_c(nti) { generic_reader_c(nti) {
int pos; int pos;
dts_header_t dtsheader; dts_header_t dtsheader;

View File

@ -40,7 +40,7 @@ private:
int64_t bytes_processed, size; int64_t bytes_processed, size;
public: public:
dts_reader_c(track_info_t *nti) throw (error_c); dts_reader_c(track_info_c *nti) throw (error_c);
virtual ~dts_reader_c(); virtual ~dts_reader_c();
virtual int read(generic_packetizer_c *ptzr); virtual int read(generic_packetizer_c *ptzr);

View File

@ -82,7 +82,7 @@ int flac_reader_c::probe_file(mm_io_c *mm_io, int64_t size) {
return 1; return 1;
} }
flac_reader_c::flac_reader_c(track_info_t *nti) throw (error_c): flac_reader_c::flac_reader_c(track_info_c *nti) throw (error_c):
generic_reader_c(nti) { generic_reader_c(nti) {
unsigned char *buf; unsigned char *buf;
uint32_t size; uint32_t size;

View File

@ -52,7 +52,7 @@ private:
vector<flac_block_t>::iterator current_block; vector<flac_block_t>::iterator current_block;
public: public:
flac_reader_c(track_info_t *nti) throw (error_c); flac_reader_c(track_info_c *nti) throw (error_c);
virtual ~flac_reader_c(); virtual ~flac_reader_c();
virtual int read(generic_packetizer_c *ptzr); virtual int read(generic_packetizer_c *ptzr);

View File

@ -115,7 +115,7 @@ int kax_reader_c::probe_file(mm_io_c *mm_io, int64_t size) {
// {{{ C'TOR // {{{ C'TOR
kax_reader_c::kax_reader_c(track_info_t *nti) throw (error_c): kax_reader_c::kax_reader_c(track_info_c *nti) throw (error_c):
generic_reader_c(nti) { generic_reader_c(nti) {
title = ""; title = "";
@ -1231,23 +1231,24 @@ int kax_reader_c::read_headers() {
void kax_reader_c::create_packetizers() { void kax_reader_c::create_packetizers() {
int i; int i;
kax_track_t *t; kax_track_t *t;
track_info_t nti; track_info_c *nti;
for (i = 0; i < tracks.size(); i++) { for (i = 0; i < tracks.size(); i++) {
t = tracks[i]; t = tracks[i];
memcpy(&nti, ti, sizeof(track_info_t)); nti = new track_info_c(*ti);
nti.private_data = (unsigned char *)t->private_data; nti->private_data =
nti.private_size = t->private_size; (unsigned char *)safememdup(t->private_data, t->private_size);
if (nti.default_track == 0) nti->private_size = t->private_size;
nti.default_track = t->default_track; if (nti->default_track == 0)
if (nti.language == NULL) nti->default_track = t->default_track;
nti.language = t->language; if (nti->language == NULL)
if (nti.track_name == NULL) nti->language = safestrdup(t->language);
nti.track_name = t->track_name; if (nti->track_name == NULL)
nti->track_name = safestrdup(t->track_name);
if (t->ok && demuxing_requested(t->type, t->tnum)) { if (t->ok && demuxing_requested(t->type, t->tnum)) {
nti.id = t->tnum; // ID for this track. nti->id = t->tnum; // ID for this track.
switch (t->type) { switch (t->type) {
case 'v': case 'v':
@ -1257,8 +1258,8 @@ void kax_reader_c::create_packetizers() {
t->packetizer = new video_packetizer_c(this, t->codec_id, t->v_frate, t->packetizer = new video_packetizer_c(this, t->codec_id, t->v_frate,
t->v_width, t->v_width,
t->v_height, t->v_height,
t->v_bframes, &nti); t->v_bframes, nti);
if (!nti.aspect_ratio_given) { // The user didn't set it. if (!nti->aspect_ratio_given) { // The user didn't set it.
if (t->v_dwidth != 0) if (t->v_dwidth != 0)
t->packetizer->set_video_display_width(t->v_dwidth); t->packetizer->set_video_display_width(t->v_dwidth);
if (t->v_dheight != 0) if (t->v_dheight != 0)
@ -1271,14 +1272,14 @@ void kax_reader_c::create_packetizers() {
t->packetizer = new pcm_packetizer_c(this, t->packetizer = new pcm_packetizer_c(this,
(unsigned long)t->a_sfreq, (unsigned long)t->a_sfreq,
t->a_channels, t->a_bps, t->a_channels, t->a_bps,
&nti); nti);
if (verbose) if (verbose)
mxinfo("+-> Using the PCM output module for track ID %u.\n", mxinfo("+-> Using the PCM output module for track ID %u.\n",
t->tnum); t->tnum);
} else if (t->a_formattag == 0x0055) { } else if (t->a_formattag == 0x0055) {
t->packetizer = new mp3_packetizer_c(this, t->packetizer = new mp3_packetizer_c(this,
(unsigned long)t->a_sfreq, (unsigned long)t->a_sfreq,
t->a_channels, &nti); t->a_channels, nti);
if (verbose) if (verbose)
mxinfo("+-> Using the MPEG audio output module for track ID %u." mxinfo("+-> Using the MPEG audio output module for track ID %u."
"\n", t->tnum); "\n", t->tnum);
@ -1293,7 +1294,7 @@ void kax_reader_c::create_packetizers() {
bsid = 0; bsid = 0;
t->packetizer = new ac3_packetizer_c(this, t->packetizer = new ac3_packetizer_c(this,
(unsigned long)t->a_sfreq, (unsigned long)t->a_sfreq,
t->a_channels, bsid, &nti); t->a_channels, bsid, nti);
if (verbose) if (verbose)
mxinfo("+-> Using the AC3 output module for track ID %u.\n", mxinfo("+-> Using the AC3 output module for track ID %u.\n",
t->tnum); t->tnum);
@ -1304,7 +1305,7 @@ void kax_reader_c::create_packetizers() {
/* /*
t->packetizer = new dts_packetizer_c(this, t->packetizer = new dts_packetizer_c(this,
(unsigned long)t->a_sfreq, (unsigned long)t->a_sfreq,
&nti); nti);
*/ */
} else if (t->a_formattag == 0xFFFE) { } else if (t->a_formattag == 0xFFFE) {
t->packetizer = new vorbis_packetizer_c(this, t->packetizer = new vorbis_packetizer_c(this,
@ -1313,7 +1314,7 @@ void kax_reader_c::create_packetizers() {
t->headers[1], t->headers[1],
t->header_sizes[1], t->header_sizes[1],
t->headers[2], t->headers[2],
t->header_sizes[2], &nti); t->header_sizes[2], nti);
if (verbose) if (verbose)
mxinfo("+-> Using the Vorbis output module for track ID %u.\n", mxinfo("+-> Using the Vorbis output module for track ID %u.\n",
t->tnum); t->tnum);
@ -1355,7 +1356,7 @@ void kax_reader_c::create_packetizers() {
t->packetizer = new aac_packetizer_c(this, id, profile, t->packetizer = new aac_packetizer_c(this, id, profile,
(unsigned long)t->a_sfreq, (unsigned long)t->a_sfreq,
t->a_channels, &nti, t->a_channels, nti,
false, true); false, true);
if (verbose) if (verbose)
mxinfo("+-> Using the AAC output module for track ID %u.\n", mxinfo("+-> Using the AAC output module for track ID %u.\n",
@ -1382,14 +1383,15 @@ void kax_reader_c::create_packetizers() {
#if defined(HAVE_FLAC_FORMAT_H) #if defined(HAVE_FLAC_FORMAT_H)
} else if ((t->a_formattag == FOURCC('f', 'L', 'a', 'C')) || } else if ((t->a_formattag == FOURCC('f', 'L', 'a', 'C')) ||
(t->a_formattag == 0xf1ac)) { (t->a_formattag == 0xf1ac)) {
nti.private_data = NULL; safefree(nti->private_data);
nti.private_size = 0; nti->private_data = NULL;
nti->private_size = 0;
if (t->a_formattag == FOURCC('f', 'L', 'a', 'C')) if (t->a_formattag == FOURCC('f', 'L', 'a', 'C'))
t->packetizer = t->packetizer =
new flac_packetizer_c(this, (int)t->a_sfreq, t->a_channels, new flac_packetizer_c(this, (int)t->a_sfreq, t->a_channels,
t->a_bps, t->a_bps,
(unsigned char *)t->private_data, (unsigned char *)t->private_data,
t->private_size, &nti); t->private_size, nti);
else else
t->packetizer = t->packetizer =
new flac_packetizer_c(this, (int)t->a_sfreq, t->a_channels, new flac_packetizer_c(this, (int)t->a_sfreq, t->a_channels,
@ -1397,7 +1399,7 @@ void kax_reader_c::create_packetizers() {
((unsigned char *)t->private_data) + ((unsigned char *)t->private_data) +
sizeof(alWAVEFORMATEX), sizeof(alWAVEFORMATEX),
t->private_size - sizeof(alWAVEFORMATEX), t->private_size - sizeof(alWAVEFORMATEX),
&nti); nti);
if (verbose) if (verbose)
mxinfo("+-> Using the FLAC output module for track ID %u.\n", mxinfo("+-> Using the FLAC output module for track ID %u.\n",
t->tnum); t->tnum);
@ -1416,7 +1418,7 @@ void kax_reader_c::create_packetizers() {
if (!strcmp(t->codec_id, MKV_S_VOBSUB)) { if (!strcmp(t->codec_id, MKV_S_VOBSUB)) {
t->packetizer = t->packetizer =
new vobsub_packetizer_c(this, t->private_data, t->private_size, new vobsub_packetizer_c(this, t->private_data, t->private_size,
false, &nti); false, nti);
if (verbose) if (verbose)
mxinfo("+-> Using the VobSub output module for track ID %u.\n", mxinfo("+-> Using the VobSub output module for track ID %u.\n",
t->tnum); t->tnum);
@ -1427,7 +1429,7 @@ void kax_reader_c::create_packetizers() {
t->packetizer = new textsubs_packetizer_c(this, t->codec_id, t->packetizer = new textsubs_packetizer_c(this, t->codec_id,
t->private_data, t->private_data,
t->private_size, false, t->private_size, false,
true, &nti); true, nti);
if (verbose) if (verbose)
mxinfo("+-> Using the text subtitle output module for track ID " mxinfo("+-> Using the text subtitle output module for track ID "
"%u.\n", t->tnum); "%u.\n", t->tnum);
@ -1446,6 +1448,8 @@ void kax_reader_c::create_packetizers() {
"UID %u because it is already allocated for the new " "UID %u because it is already allocated for the new "
"file.\n", t->tuid); "file.\n", t->tuid);
} }
delete nti;
} }
if (segment_title.length() == 0) if (segment_title.length() == 0)

View File

@ -123,7 +123,7 @@ private:
vector<kax_attachment_t> attachments; vector<kax_attachment_t> attachments;
public: public:
kax_reader_c(track_info_t *nti) throw (error_c); kax_reader_c(track_info_c *nti) throw (error_c);
virtual ~kax_reader_c(); virtual ~kax_reader_c();
virtual int read(generic_packetizer_c *ptzr); virtual int read(generic_packetizer_c *ptzr);

View File

@ -68,7 +68,7 @@ int mp3_reader_c::probe_file(mm_io_c *mm_io, int64_t size) {
return 1; return 1;
} }
mp3_reader_c::mp3_reader_c(track_info_t *nti) throw (error_c): mp3_reader_c::mp3_reader_c(track_info_c *nti) throw (error_c):
generic_reader_c(nti) { generic_reader_c(nti) {
int pos, ptr, buf_size; int pos, ptr, buf_size;
unsigned char buf[16384]; unsigned char buf[16384];

View File

@ -40,7 +40,7 @@ private:
mp3_header_t mp3header; mp3_header_t mp3header;
public: public:
mp3_reader_c(track_info_t *nti) throw (error_c); mp3_reader_c(track_info_c *nti) throw (error_c);
virtual ~mp3_reader_c(); virtual ~mp3_reader_c();
virtual int read(generic_packetizer_c *ptzr); virtual int read(generic_packetizer_c *ptzr);

View File

@ -234,7 +234,7 @@ int ogm_reader_c::probe_file(mm_io_c *mm_io, int64_t size) {
* Opens the file for processing, initializes an ogg_sync_state used for * Opens the file for processing, initializes an ogg_sync_state used for
* reading from an OGG stream. * reading from an OGG stream.
*/ */
ogm_reader_c::ogm_reader_c(track_info_t *nti) throw (error_c): ogm_reader_c::ogm_reader_c(track_info_c *nti) throw (error_c):
generic_reader_c(nti) { generic_reader_c(nti) {
try { try {

View File

@ -103,7 +103,7 @@ private:
int64_t file_size; int64_t file_size;
public: public:
ogm_reader_c(track_info_t *nti) throw (error_c); ogm_reader_c(track_info_c *nti) throw (error_c);
virtual ~ogm_reader_c(); virtual ~ogm_reader_c();
virtual int read(generic_packetizer_c *ptzr); virtual int read(generic_packetizer_c *ptzr);

View File

@ -80,7 +80,7 @@ int qtmp4_reader_c::probe_file(mm_io_c *in, int64_t size) {
return 0; return 0;
} }
qtmp4_reader_c::qtmp4_reader_c(track_info_t *nti) throw (error_c) : qtmp4_reader_c::qtmp4_reader_c(track_info_c *nti) throw (error_c) :
generic_reader_c(nti) { generic_reader_c(nti) {
try { try {
io = new mm_io_c(ti->fname, MODE_READ); io = new mm_io_c(ti->fname, MODE_READ);

View File

@ -120,7 +120,7 @@ private:
int main_dmx; int main_dmx;
public: public:
qtmp4_reader_c(track_info_t *nti) throw (error_c); qtmp4_reader_c(track_info_c *nti) throw (error_c);
virtual ~qtmp4_reader_c(); virtual ~qtmp4_reader_c();
virtual int read(generic_packetizer_c *ptzr); virtual int read(generic_packetizer_c *ptzr);

View File

@ -140,7 +140,7 @@ int real_reader_c::probe_file(mm_io_c *io, int64_t size) {
// {{{ C'TOR // {{{ C'TOR
real_reader_c::real_reader_c(track_info_t *nti) throw (error_c): real_reader_c::real_reader_c(track_info_c *nti) throw (error_c):
generic_reader_c(nti) { generic_reader_c(nti) {
try { try {

View File

@ -72,7 +72,7 @@ private:
bool done; bool done;
public: public:
real_reader_c(track_info_t *nti) throw (error_c); real_reader_c(track_info_c *nti) throw (error_c);
virtual ~real_reader_c(); virtual ~real_reader_c();
virtual int read(generic_packetizer_c *ptzr); virtual int read(generic_packetizer_c *ptzr);

View File

@ -65,7 +65,7 @@ int srt_reader_c::probe_file(mm_text_io_c *mm_io, int64_t) {
return 1; return 1;
} }
srt_reader_c::srt_reader_c(track_info_t *nti) throw (error_c): srt_reader_c::srt_reader_c(track_info_c *nti) throw (error_c):
generic_reader_c(nti) { generic_reader_c(nti) {
bool is_utf8; bool is_utf8;

View File

@ -38,7 +38,7 @@ private:
int act_wchar; int act_wchar;
public: public:
srt_reader_c(track_info_t *nti) throw (error_c); srt_reader_c(track_info_c *nti) throw (error_c);
virtual ~srt_reader_c(); virtual ~srt_reader_c();
virtual int read(generic_packetizer_c *ptzr); virtual int read(generic_packetizer_c *ptzr);

View File

@ -62,7 +62,7 @@ int ssa_reader_c::probe_file(mm_text_io_c *mm_io, int64_t size) {
return 1; return 1;
} }
ssa_reader_c::ssa_reader_c(track_info_t *nti) throw (error_c): ssa_reader_c::ssa_reader_c(track_info_c *nti) throw (error_c):
generic_reader_c(nti) { generic_reader_c(nti) {
string line, global; string line, global;
int64_t old_pos; int64_t old_pos;

View File

@ -45,7 +45,7 @@ private:
int cc_utf8; int cc_utf8;
public: public:
ssa_reader_c(track_info_t *nti) throw (error_c); ssa_reader_c(track_info_c *nti) throw (error_c);
virtual ~ssa_reader_c(); virtual ~ssa_reader_c();
virtual int read(generic_packetizer_c *ptzr); virtual int read(generic_packetizer_c *ptzr);

View File

@ -85,7 +85,7 @@ int vobsub_reader_c::probe_file(mm_io_c *mm_io, int64_t size) {
return 1; return 1;
} }
vobsub_reader_c::vobsub_reader_c(track_info_t *nti) throw (error_c): vobsub_reader_c::vobsub_reader_c(track_info_c *nti) throw (error_c):
generic_reader_c(nti) { generic_reader_c(nti) {
string sub_name, line; string sub_name, line;
int len; int len;

View File

@ -61,7 +61,7 @@ private:
vector<vobsub_track_c *> tracks; vector<vobsub_track_c *> tracks;
public: public:
vobsub_reader_c(track_info_t *nti) throw (error_c); vobsub_reader_c(track_info_c *nti) throw (error_c);
virtual ~vobsub_reader_c(); virtual ~vobsub_reader_c();
virtual int read(generic_packetizer_c *ptzr); virtual int read(generic_packetizer_c *ptzr);

View File

@ -111,7 +111,7 @@ int wav_reader_c::probe_file(mm_io_c *mm_io, int64_t size) {
return 1; return 1;
} }
wav_reader_c::wav_reader_c(track_info_t *nti) throw (error_c): wav_reader_c::wav_reader_c(track_info_c *nti) throw (error_c):
generic_reader_c(nti) { generic_reader_c(nti) {
int64_t size; int64_t size;

View File

@ -50,7 +50,7 @@ private:
bool is_dts; bool is_dts;
public: public:
wav_reader_c(track_info_t *nti) throw (error_c); wav_reader_c(track_info_c *nti) throw (error_c);
virtual ~wav_reader_c(); virtual ~wav_reader_c();
virtual int read(generic_packetizer_c *ptzr); virtual int read(generic_packetizer_c *ptzr);

View File

@ -110,7 +110,7 @@ typedef struct filelist_tag {
generic_reader_c *reader; generic_reader_c *reader;
track_info_t *ti; track_info_c *ti;
} filelist_t; } filelist_t;
typedef struct { typedef struct {
@ -636,7 +636,7 @@ static void parse_sync(char *s, audio_sync_t &async, const char *opt) {
async.displacement = atoi(s); async.displacement = atoi(s);
} }
static void parse_aspect_ratio(char *s, const char *opt, track_info_t &ti) { static void parse_aspect_ratio(char *s, const char *opt, track_info_c &ti) {
char *div, *c; char *div, *c;
float w, h; float w, h;
string orig = s; string orig = s;
@ -678,7 +678,7 @@ static void parse_aspect_ratio(char *s, const char *opt, track_info_t &ti) {
ti.display_properties->push_back(dprop); ti.display_properties->push_back(dprop);
} }
static void parse_display_dimensions(char *s, track_info_t &ti) { static void parse_display_dimensions(char *s, track_info_c &ti) {
char *x, *c; char *x, *c;
string orig = s; string orig = s;
int w, h; int w, h;
@ -906,7 +906,7 @@ static void parse_tags(char *s, tags_t &tags, const char *opt) {
tags.file_name = s; tags.file_name = s;
} }
static void parse_fourcc(char *s, const char *opt, track_info_t &ti) { static void parse_fourcc(char *s, const char *opt, track_info_c &ti) {
char *c; char *c;
string orig = s; string orig = s;
fourcc_t fourcc; fourcc_t fourcc;
@ -1181,27 +1181,9 @@ static void create_readers() {
// {{{ FUNCTION identify(const char *filename) // {{{ FUNCTION identify(const char *filename)
static void identify(const char *filename) { static void identify(const char *filename) {
track_info_t ti; track_info_c ti;
filelist_t *file; filelist_t *file;
memset(&ti, 0, sizeof(track_info_t));
ti.audio_syncs = new vector<audio_sync_t>;
ti.cue_creations = new vector<cue_creation_t>;
ti.default_track_flags = new vector<int64_t>;
ti.languages = new vector<language_t>;
ti.sub_charsets = new vector<language_t>;
ti.all_tags = new vector<tags_t>;
ti.aspect_ratio = 0.0;
ti.atracks = new vector<int64_t>;
ti.vtracks = new vector<int64_t>;
ti.stracks = new vector<int64_t>;
ti.aac_is_sbr = new vector<int64_t>;
ti.compression_list = new vector<cue_creation_t>;
ti.track_names = new vector<language_t>;
ti.all_ext_timecodes = new vector<language_t>;
ti.all_fourccs = new vector<fourcc_t>;
ti.display_properties = new vector<display_properties_t>;
file = (filelist_t *)safemalloc(sizeof(filelist_t)); file = (filelist_t *)safemalloc(sizeof(filelist_t));
file->name = safestrdup(filename); file->name = safestrdup(filename);
@ -1217,7 +1199,7 @@ static void identify(const char *filename) {
file->fp = NULL; file->fp = NULL;
file->status = EMOREDATA; file->status = EMOREDATA;
file->pack = NULL; file->pack = NULL;
file->ti = duplicate_track_info(&ti); file->ti = new track_info_c(ti);
files.push_back(file); files.push_back(file);
@ -1233,7 +1215,7 @@ static void identify(const char *filename) {
// {{{ FUNCTION parse_args(int argc, char **argv) // {{{ FUNCTION parse_args(int argc, char **argv)
static void parse_args(int argc, char **argv) { static void parse_args(int argc, char **argv) {
track_info_t ti; track_info_c *ti;
int i, j, cc_command_line; int i, j, cc_command_line;
filelist_t *file; filelist_t *file;
char *s, *this_arg, *next_arg; char *s, *this_arg, *next_arg;
@ -1245,23 +1227,7 @@ static void parse_args(int argc, char **argv) {
tags_t tags; tags_t tags;
mm_io_c *io; mm_io_c *io;
memset(&ti, 0, sizeof(track_info_t)); ti = new track_info_c;
ti.audio_syncs = new vector<audio_sync_t>;
ti.cue_creations = new vector<cue_creation_t>;
ti.default_track_flags = new vector<int64_t>;
ti.languages = new vector<language_t>;
ti.sub_charsets = new vector<language_t>;
ti.all_tags = new vector<tags_t>;
ti.aac_is_sbr = new vector<int64_t>;
ti.aspect_ratio = 0.0;
ti.atracks = new vector<int64_t>;
ti.vtracks = new vector<int64_t>;
ti.stracks = new vector<int64_t>;
ti.compression_list = new vector<cue_creation_t>;
ti.track_names = new vector<language_t>;
ti.all_ext_timecodes = new vector<language_t>;
ti.all_fourccs = new vector<fourcc_t>;
ti.display_properties = new vector<display_properties_t>;
attachment = (attachment_t *)safemalloc(sizeof(attachment_t)); attachment = (attachment_t *)safemalloc(sizeof(attachment_t));
memset(attachment, 0, sizeof(attachment_t)); memset(attachment, 0, sizeof(attachment_t));
memset(&tags, 0, sizeof(tags_t)); memset(&tags, 0, sizeof(tags_t));
@ -1607,13 +1573,13 @@ static void parse_args(int argc, char **argv) {
i++; i++;
} else if (!strcmp(this_arg, "--no-chapters")) { } else if (!strcmp(this_arg, "--no-chapters")) {
ti.no_chapters = true; ti->no_chapters = true;
} else if (!strcmp(this_arg, "--no-attachments")) { } else if (!strcmp(this_arg, "--no-attachments")) {
ti.no_attachments = true; ti->no_attachments = true;
} else if (!strcmp(this_arg, "--no-tags")) { } else if (!strcmp(this_arg, "--no-tags")) {
ti.no_tags = true; ti->no_tags = true;
} else if (!strcmp(this_arg, "--dump-packets")) { } else if (!strcmp(this_arg, "--dump-packets")) {
if (next_arg == NULL) if (next_arg == NULL)
@ -1633,54 +1599,54 @@ static void parse_args(int argc, char **argv) {
// Options that apply to the next input file only. // Options that apply to the next input file only.
else if (!strcmp(this_arg, "-A") || !strcmp(this_arg, "--noaudio")) else if (!strcmp(this_arg, "-A") || !strcmp(this_arg, "--noaudio"))
ti.no_audio = true; ti->no_audio = true;
else if (!strcmp(this_arg, "-D") || !strcmp(this_arg, "--novideo")) else if (!strcmp(this_arg, "-D") || !strcmp(this_arg, "--novideo"))
ti.no_video = true; ti->no_video = true;
else if (!strcmp(this_arg, "-S") || !strcmp(this_arg, "--nosubs")) else if (!strcmp(this_arg, "-S") || !strcmp(this_arg, "--nosubs"))
ti.no_subs = true; ti->no_subs = true;
else if (!strcmp(this_arg, "-a") || !strcmp(this_arg, "--atracks")) { else if (!strcmp(this_arg, "-a") || !strcmp(this_arg, "--atracks")) {
if (next_arg == NULL) if (next_arg == NULL)
mxerror("'%s' lacks the stream number(s).\n", this_arg); mxerror("'%s' lacks the stream number(s).\n", this_arg);
parse_tracks(next_arg, ti.atracks, this_arg); parse_tracks(next_arg, ti->atracks, this_arg);
i++; i++;
} else if (!strcmp(this_arg, "-d") || !strcmp(this_arg, "--vtracks")) { } else if (!strcmp(this_arg, "-d") || !strcmp(this_arg, "--vtracks")) {
if (next_arg == NULL) if (next_arg == NULL)
mxerror("'%s' lacks the stream number(s).\n", this_arg); mxerror("'%s' lacks the stream number(s).\n", this_arg);
parse_tracks(next_arg, ti.vtracks, this_arg); parse_tracks(next_arg, ti->vtracks, this_arg);
i++; i++;
} else if (!strcmp(this_arg, "-s") || !strcmp(this_arg, "--stracks")) { } else if (!strcmp(this_arg, "-s") || !strcmp(this_arg, "--stracks")) {
if (next_arg == NULL) if (next_arg == NULL)
mxerror("'%s' lacks the stream number(s).\n", this_arg); mxerror("'%s' lacks the stream number(s).\n", this_arg);
parse_tracks(next_arg, ti.stracks, this_arg); parse_tracks(next_arg, ti->stracks, this_arg);
i++; i++;
} else if (!strcmp(this_arg, "-f") || !strcmp(this_arg, "--fourcc")) { } else if (!strcmp(this_arg, "-f") || !strcmp(this_arg, "--fourcc")) {
if (next_arg == NULL) if (next_arg == NULL)
mxerror("'%s' lacks the FourCC.\n", this_arg); mxerror("'%s' lacks the FourCC.\n", this_arg);
parse_fourcc(next_arg, this_arg, ti); parse_fourcc(next_arg, this_arg, *ti);
i++; i++;
} else if (!strcmp(this_arg, "--aspect-ratio")) { } else if (!strcmp(this_arg, "--aspect-ratio")) {
if (next_arg == NULL) if (next_arg == NULL)
mxerror("'--aspect-ratio' lacks the aspect ratio.\n"); mxerror("'--aspect-ratio' lacks the aspect ratio.\n");
parse_aspect_ratio(next_arg, this_arg, ti); parse_aspect_ratio(next_arg, this_arg, *ti);
i++; i++;
} else if (!strcmp(this_arg, "--display-dimensions")) { } else if (!strcmp(this_arg, "--display-dimensions")) {
if (next_arg == NULL) if (next_arg == NULL)
mxerror("'--display-dimensions' lacks the dimensions.\n"); mxerror("'--display-dimensions' lacks the dimensions.\n");
parse_display_dimensions(next_arg, ti); parse_display_dimensions(next_arg, *ti);
i++; i++;
} else if (!strcmp(this_arg, "-y") || !strcmp(this_arg, "--sync")) { } else if (!strcmp(this_arg, "-y") || !strcmp(this_arg, "--sync")) {
@ -1688,7 +1654,7 @@ static void parse_args(int argc, char **argv) {
mxerror("'%s' lacks the audio delay.\n", this_arg); mxerror("'%s' lacks the audio delay.\n", this_arg);
parse_sync(next_arg, async, this_arg); parse_sync(next_arg, async, this_arg);
ti.audio_syncs->push_back(async); ti->audio_syncs->push_back(async);
i++; i++;
} else if (!strcmp(this_arg, "--cues")) { } else if (!strcmp(this_arg, "--cues")) {
@ -1696,7 +1662,7 @@ static void parse_args(int argc, char **argv) {
mxerror("'--cues' lacks its argument.\n"); mxerror("'--cues' lacks its argument.\n");
parse_cues(next_arg, cues); parse_cues(next_arg, cues);
ti.cue_creations->push_back(cues); ti->cue_creations->push_back(cues);
i++; i++;
} else if (!strcmp(this_arg, "--default-track")) { } else if (!strcmp(this_arg, "--default-track")) {
@ -1707,7 +1673,7 @@ static void parse_args(int argc, char **argv) {
mxerror("Invalid track ID specified in '%s %s'.\n", this_arg, mxerror("Invalid track ID specified in '%s %s'.\n", this_arg,
next_arg); next_arg);
ti.default_track_flags->push_back(id); ti->default_track_flags->push_back(id);
i++; i++;
} else if (!strcmp(this_arg, "--language")) { } else if (!strcmp(this_arg, "--language")) {
@ -1715,7 +1681,7 @@ static void parse_args(int argc, char **argv) {
mxerror("'--language' lacks its argument.\n"); mxerror("'--language' lacks its argument.\n");
parse_language(next_arg, lang, "language", "language", true); parse_language(next_arg, lang, "language", "language", true);
ti.languages->push_back(lang); ti->languages->push_back(lang);
i++; i++;
} else if (!strcmp(this_arg, "--sub-charset")) { } else if (!strcmp(this_arg, "--sub-charset")) {
@ -1723,7 +1689,7 @@ static void parse_args(int argc, char **argv) {
mxerror("'--sub-charset' lacks its argument.\n"); mxerror("'--sub-charset' lacks its argument.\n");
parse_sub_charset(next_arg, lang); parse_sub_charset(next_arg, lang);
ti.sub_charsets->push_back(lang); ti->sub_charsets->push_back(lang);
i++; i++;
} else if (!strcmp(this_arg, "-t") || !strcmp(this_arg, "--tags")) { } else if (!strcmp(this_arg, "-t") || !strcmp(this_arg, "--tags")) {
@ -1731,7 +1697,7 @@ static void parse_args(int argc, char **argv) {
mxerror("'%s' lacks its argument.\n", this_arg); mxerror("'%s' lacks its argument.\n", this_arg);
parse_tags(next_arg, tags, this_arg); parse_tags(next_arg, tags, this_arg);
ti.all_tags->push_back(tags); ti->all_tags->push_back(tags);
i++; i++;
} else if (!strcmp(this_arg, "--aac-is-sbr")) { } else if (!strcmp(this_arg, "--aac-is-sbr")) {
@ -1742,7 +1708,7 @@ static void parse_args(int argc, char **argv) {
mxerror("Invalid track ID specified in '%s %s'.\n", this_arg, mxerror("Invalid track ID specified in '%s %s'.\n", this_arg,
next_arg); next_arg);
ti.aac_is_sbr->push_back(id); ti->aac_is_sbr->push_back(id);
i++; i++;
} else if (!strcmp(this_arg, "--compression")) { } else if (!strcmp(this_arg, "--compression")) {
@ -1750,7 +1716,7 @@ static void parse_args(int argc, char **argv) {
mxerror("'--compression' lacks its argument.\n"); mxerror("'--compression' lacks its argument.\n");
parse_compression(next_arg, cues); parse_compression(next_arg, cues);
ti.compression_list->push_back(cues); ti->compression_list->push_back(cues);
i++; i++;
} else if (!strcmp(this_arg, "--track-name")) { } else if (!strcmp(this_arg, "--track-name")) {
@ -1759,7 +1725,7 @@ static void parse_args(int argc, char **argv) {
parse_language(next_arg, lang, "track-name", "track name", false); parse_language(next_arg, lang, "track-name", "track name", false);
lang.language = to_utf8(cc_command_line, lang.language); lang.language = to_utf8(cc_command_line, lang.language);
ti.track_names->push_back(lang); ti->track_names->push_back(lang);
i++; i++;
} else if (!strcmp(this_arg, "--timecodes")) { } else if (!strcmp(this_arg, "--timecodes")) {
@ -1767,27 +1733,27 @@ static void parse_args(int argc, char **argv) {
mxerror("'--timecodes' lacks its argument.\n"); mxerror("'--timecodes' lacks its argument.\n");
parse_language(next_arg, lang, "timecodes", "timecodes", false); parse_language(next_arg, lang, "timecodes", "timecodes", false);
ti.all_ext_timecodes->push_back(lang); ti->all_ext_timecodes->push_back(lang);
i++; i++;
} }
// The argument is an input file. // The argument is an input file.
else { else {
if ((ti.atracks->size() != 0) && ti.no_audio) if ((ti->atracks->size() != 0) && ti->no_audio)
mxerror("'-A' and '-a' used on the same source file.\n"); mxerror("'-A' and '-a' used on the same source file.\n");
if ((ti.vtracks->size() != 0) && ti.no_video) if ((ti->vtracks->size() != 0) && ti->no_video)
mxerror("'-D' and '-d' used on the same source file.\n"); mxerror("'-D' and '-d' used on the same source file.\n");
if ((ti.stracks->size() != 0) && ti.no_subs) if ((ti->stracks->size() != 0) && ti->no_subs)
mxerror("'-S' and '-s' used on the same source file.\n"); mxerror("'-S' and '-s' used on the same source file.\n");
file = (filelist_t *)safemalloc(sizeof(filelist_t)); file = (filelist_t *)safemalloc(sizeof(filelist_t));
file->name = this_arg; file->name = safestrdup(this_arg);
file->type = get_type(file->name); file->type = get_type(file->name);
ti.fname = this_arg; ti->fname = safestrdup(this_arg);
if (file->type == TYPEUNKNOWN) if (file->type == TYPEUNKNOWN)
mxerror("File '%s' has unknown type. Please have a look " mxerror("File '%s' has unknown type. Please have a look "
@ -1799,46 +1765,13 @@ static void parse_args(int argc, char **argv) {
if (file->type != TYPECHAPTERS) { if (file->type != TYPECHAPTERS) {
file->status = EMOREDATA; file->status = EMOREDATA;
file->pack = NULL; file->pack = NULL;
file->ti = duplicate_track_info(&ti); file->ti = ti;
files.push_back(file); files.push_back(file);
} else } else
safefree(file); safefree(file);
delete ti.atracks; ti = new track_info_c;
delete ti.vtracks;
delete ti.stracks;
delete ti.audio_syncs;
delete ti.cue_creations;
delete ti.default_track_flags;
delete ti.languages;
delete ti.sub_charsets;
delete ti.all_tags;
delete ti.aac_is_sbr;
delete ti.compression_list;
for (j = 0; j < ti.track_names->size(); j++)
safefree((*ti.track_names)[j].language);
delete ti.track_names;
delete ti.all_ext_timecodes;
delete ti.all_fourccs;
delete ti.display_properties;
memset(&ti, 0, sizeof(track_info_t));
ti.audio_syncs = new vector<audio_sync_t>;
ti.cue_creations = new vector<cue_creation_t>;
ti.default_track_flags = new vector<int64_t>;
ti.languages = new vector<language_t>;
ti.sub_charsets = new vector<language_t>;
ti.all_tags = new vector<tags_t>;
ti.aac_is_sbr = new vector<int64_t>;
ti.aspect_ratio = 0.0;
ti.atracks = new vector<int64_t>;
ti.vtracks = new vector<int64_t>;
ti.stracks = new vector<int64_t>;
ti.compression_list = new vector<cue_creation_t>;
ti.track_names = new vector<language_t>;
ti.all_ext_timecodes = new vector<language_t>;
ti.all_fourccs = new vector<fourcc_t>;
ti.display_properties = new vector<display_properties_t>;
} }
} }
@ -1862,23 +1795,7 @@ static void parse_args(int argc, char **argv) {
attachment_sizes_others += attachments[i]->size; attachment_sizes_others += attachments[i]->size;
} }
delete ti.audio_syncs; delete ti;
delete ti.cue_creations;
delete ti.default_track_flags;
delete ti.languages;
delete ti.sub_charsets;
delete ti.all_tags;
delete ti.aac_is_sbr;
delete ti.atracks;
delete ti.vtracks;
delete ti.stracks;
delete ti.compression_list;
for (j = 0; j < ti.track_names->size(); j++)
safefree((*ti.track_names)[j].language);
delete ti.track_names;
delete ti.all_ext_timecodes;
delete ti.all_fourccs;
delete ti.display_properties;
safefree(attachment); safefree(attachment);
} }
@ -2013,7 +1930,7 @@ static void cleanup() {
while (files.size()) { while (files.size()) {
file = files[files.size() - 1]; file = files[files.size() - 1];
free_track_info(file->ti); delete file->ti;
safefree(file); safefree(file);
files.pop_back(); files.pop_back();
} }

View File

@ -34,7 +34,7 @@ using namespace libmatroska;
aac_packetizer_c::aac_packetizer_c(generic_reader_c *nreader, int nid, aac_packetizer_c::aac_packetizer_c(generic_reader_c *nreader, int nid,
int nprofile, int nprofile,
unsigned long nsamples_per_sec, unsigned long nsamples_per_sec,
int nchannels, track_info_t *nti, int nchannels, track_info_c *nti,
bool nemphasis_present, bool nemphasis_present,
bool nheaderless) bool nheaderless)
throw (error_c): generic_packetizer_c(nreader, nti) { throw (error_c): generic_packetizer_c(nreader, nti) {

View File

@ -48,7 +48,7 @@ private:
public: public:
aac_packetizer_c(generic_reader_c *nreader, int nid, int nprofile, aac_packetizer_c(generic_reader_c *nreader, int nid, int nprofile,
unsigned long nsamples_per_sec, int nchannels, unsigned long nsamples_per_sec, int nchannels,
track_info_t *nti, bool emphasis_present, track_info_c *nti, bool emphasis_present,
bool nheaderless = false) throw (error_c); bool nheaderless = false) throw (error_c);
virtual ~aac_packetizer_c(); virtual ~aac_packetizer_c();

View File

@ -33,7 +33,7 @@ using namespace libmatroska;
ac3_packetizer_c::ac3_packetizer_c(generic_reader_c *nreader, ac3_packetizer_c::ac3_packetizer_c(generic_reader_c *nreader,
unsigned long nsamples_per_sec, unsigned long nsamples_per_sec,
int nchannels, int nbsid, track_info_t *nti) int nchannels, int nbsid, track_info_c *nti)
throw (error_c): generic_packetizer_c(nreader, nti) { throw (error_c): generic_packetizer_c(nreader, nti) {
packetno = 0; packetno = 0;
bytes_output = 0; bytes_output = 0;
@ -159,7 +159,7 @@ void ac3_packetizer_c::dump_debug_info() {
ac3_bs_packetizer_c::ac3_bs_packetizer_c(generic_reader_c *nreader, ac3_bs_packetizer_c::ac3_bs_packetizer_c(generic_reader_c *nreader,
unsigned long nsamples_per_sec, unsigned long nsamples_per_sec,
int nchannels, int nbsid, int nchannels, int nbsid,
track_info_t *nti) track_info_c *nti)
throw (error_c): ac3_packetizer_c(nreader, nsamples_per_sec, nchannels, throw (error_c): ac3_packetizer_c(nreader, nsamples_per_sec, nchannels,
nbsid, nti) { nbsid, nti) {
bsb_present = false; bsb_present = false;

View File

@ -37,7 +37,7 @@ protected:
public: public:
ac3_packetizer_c(generic_reader_c *nreader, unsigned long nsamples_per_sec, ac3_packetizer_c(generic_reader_c *nreader, unsigned long nsamples_per_sec,
int nchannels, int nbsid, track_info_t *nti) int nchannels, int nbsid, track_info_c *nti)
throw (error_c); throw (error_c);
virtual ~ac3_packetizer_c(); virtual ~ac3_packetizer_c();
@ -62,7 +62,7 @@ protected:
public: public:
ac3_bs_packetizer_c(generic_reader_c *nreader, ac3_bs_packetizer_c(generic_reader_c *nreader,
unsigned long nsamples_per_sec, unsigned long nsamples_per_sec,
int nchannels, int nbsid, track_info_t *nti) int nchannels, int nbsid, track_info_c *nti)
throw (error_c); throw (error_c);
protected: protected:

View File

@ -86,7 +86,7 @@ bool operator!=(const dts_header_t &l, const dts_header_t &r) {
dts_packetizer_c::dts_packetizer_c(generic_reader_c *nreader, dts_packetizer_c::dts_packetizer_c(generic_reader_c *nreader,
const dts_header_t &dtsheader, const dts_header_t &dtsheader,
track_info_t *nti) track_info_c *nti)
throw (error_c): generic_packetizer_c(nreader, nti) { throw (error_c): generic_packetizer_c(nreader, nti) {
//packetno = 0; //packetno = 0;
samples_written = 0; samples_written = 0;

View File

@ -42,7 +42,7 @@ public:
bool skipping_is_normal; bool skipping_is_normal;
dts_packetizer_c(generic_reader_c *nreader, const dts_header_t &dts_header, dts_packetizer_c(generic_reader_c *nreader, const dts_header_t &dts_header,
track_info_t *nti) throw (error_c); track_info_c *nti) throw (error_c);
virtual ~dts_packetizer_c(); virtual ~dts_packetizer_c();
virtual int process(unsigned char *buf, int size, int64_t timecode = -1, virtual int process(unsigned char *buf, int size, int64_t timecode = -1,

View File

@ -43,7 +43,7 @@ flac_packetizer_c::flac_packetizer_c(generic_reader_c *nreader,
int nsample_rate, int nchannels, int nsample_rate, int nchannels,
int nbits_per_sample, int nbits_per_sample,
unsigned char *nheader, int nl_header, unsigned char *nheader, int nl_header,
track_info_t *nti) track_info_c *nti)
throw (error_c): generic_packetizer_c(nreader, nti) { throw (error_c): generic_packetizer_c(nreader, nti) {
last_timecode = 0; last_timecode = 0;
sample_rate = nsample_rate; sample_rate = nsample_rate;

View File

@ -40,7 +40,7 @@ public:
flac_packetizer_c(generic_reader_c *nreader, flac_packetizer_c(generic_reader_c *nreader,
int nsample_rate, int nchannels, int nbits_per_sample, int nsample_rate, int nchannels, int nbits_per_sample,
unsigned char *nheader, int nl_header, unsigned char *nheader, int nl_header,
track_info_t *nti) throw (error_c); track_info_c *nti) throw (error_c);
virtual ~flac_packetizer_c(); virtual ~flac_packetizer_c();
virtual int process(unsigned char *data, int size, int64_t timecode = -1, virtual int process(unsigned char *data, int size, int64_t timecode = -1,

View File

@ -33,7 +33,7 @@ using namespace libmatroska;
mp3_packetizer_c::mp3_packetizer_c(generic_reader_c *nreader, mp3_packetizer_c::mp3_packetizer_c(generic_reader_c *nreader,
unsigned long nsamples_per_sec, unsigned long nsamples_per_sec,
int nchannels, track_info_t *nti) int nchannels, track_info_c *nti)
throw (error_c): throw (error_c):
generic_packetizer_c(nreader, nti), byte_buffer(128 * 1024) { generic_packetizer_c(nreader, nti), byte_buffer(128 * 1024) {
samples_per_sec = nsamples_per_sec; samples_per_sec = nsamples_per_sec;

View File

@ -37,7 +37,7 @@ private:
public: public:
mp3_packetizer_c(generic_reader_c *nreader, unsigned long nsamples_per_sec, mp3_packetizer_c(generic_reader_c *nreader, unsigned long nsamples_per_sec,
int nchannels, track_info_t *nti) int nchannels, track_info_c *nti)
throw (error_c); throw (error_c);
virtual ~mp3_packetizer_c(); virtual ~mp3_packetizer_c();

View File

@ -32,7 +32,7 @@
using namespace libmatroska; using namespace libmatroska;
passthrough_packetizer_c::passthrough_packetizer_c(generic_reader_c *nreader, passthrough_packetizer_c::passthrough_packetizer_c(generic_reader_c *nreader,
track_info_t *nti) track_info_c *nti)
throw (error_c): throw (error_c):
generic_packetizer_c(nreader, nti) { generic_packetizer_c(nreader, nti) {
packets_processed = 0; packets_processed = 0;

View File

@ -32,7 +32,7 @@ private:
bool sync_to_keyframe; bool sync_to_keyframe;
public: public:
passthrough_packetizer_c(generic_reader_c *nreader, track_info_t *nti) passthrough_packetizer_c(generic_reader_c *nreader, track_info_c *nti)
throw (error_c); throw (error_c);
virtual int process(unsigned char *buf, int size, int64_t timecode = -1, virtual int process(unsigned char *buf, int size, int64_t timecode = -1,

View File

@ -34,7 +34,7 @@ using namespace libmatroska;
pcm_packetizer_c::pcm_packetizer_c(generic_reader_c *nreader, pcm_packetizer_c::pcm_packetizer_c(generic_reader_c *nreader,
unsigned long nsamples_per_sec, unsigned long nsamples_per_sec,
int nchannels, int nbits_per_sample, int nchannels, int nbits_per_sample,
track_info_t *nti, bool nbig_endian) track_info_c *nti, bool nbig_endian)
throw (error_c): throw (error_c):
generic_packetizer_c(nreader, nti) { generic_packetizer_c(nreader, nti) {
packetno = 0; packetno = 0;

View File

@ -36,7 +36,7 @@ private:
public: public:
pcm_packetizer_c(generic_reader_c *nreader, unsigned long nsamples_per_sec, pcm_packetizer_c(generic_reader_c *nreader, unsigned long nsamples_per_sec,
int nchannels, int nbits_per_sample, track_info_t *nti, int nchannels, int nbits_per_sample, track_info_c *nti,
bool nbig_endian = false) bool nbig_endian = false)
throw (error_c); throw (error_c);
virtual ~pcm_packetizer_c(); virtual ~pcm_packetizer_c();

View File

@ -34,7 +34,7 @@ textsubs_packetizer_c::textsubs_packetizer_c(generic_reader_c *nreader,
const char *ncodec_id, const char *ncodec_id,
const void *nglobal_data, const void *nglobal_data,
int nglobal_size, bool nrecode, int nglobal_size, bool nrecode,
bool is_utf8, track_info_t *nti) bool is_utf8, track_info_c *nti)
throw (error_c): generic_packetizer_c(nreader, nti) { throw (error_c): generic_packetizer_c(nreader, nti) {
packetno = 0; packetno = 0;
recode = nrecode; recode = nrecode;

View File

@ -38,7 +38,7 @@ private:
public: public:
textsubs_packetizer_c(generic_reader_c *nreader, const char *ncodec_id, textsubs_packetizer_c(generic_reader_c *nreader, const char *ncodec_id,
const void *nglobal_data, int nglobal_size, const void *nglobal_data, int nglobal_size,
bool nrecode, bool is_utf8, track_info_t *nti) bool nrecode, bool is_utf8, track_info_c *nti)
throw (error_c); throw (error_c);
virtual ~textsubs_packetizer_c(); virtual ~textsubs_packetizer_c();

View File

@ -40,7 +40,7 @@ video_packetizer_c::video_packetizer_c(generic_reader_c *nreader,
const char *ncodec_id, const char *ncodec_id,
double nfps, int nwidth, double nfps, int nwidth,
int nheight, bool nbframes, int nheight, bool nbframes,
track_info_t *nti) track_info_c *nti)
throw (error_c) : generic_packetizer_c(nreader, nti) { throw (error_c) : generic_packetizer_c(nreader, nti) {
fps = nfps; fps = nfps;
width = nwidth; width = nwidth;

View File

@ -41,7 +41,7 @@ private:
public: public:
video_packetizer_c(generic_reader_c *nreader, const char *ncodec_id, video_packetizer_c(generic_reader_c *nreader, const char *ncodec_id,
double nfps, int nwidth, int nheight, bool nbframes, double nfps, int nwidth, int nheight, bool nbframes,
track_info_t *nti) track_info_c *nti)
throw (error_c); throw (error_c);
virtual ~video_packetizer_c(); virtual ~video_packetizer_c();

View File

@ -40,7 +40,7 @@ vobsub_packetizer_c::vobsub_packetizer_c(generic_reader_c *nreader,
const void *nidx_data, const void *nidx_data,
int nidx_data_size, int nidx_data_size,
bool nextract_from_mpeg, bool nextract_from_mpeg,
track_info_t *nti) throw (error_c): track_info_c *nti) throw (error_c):
generic_packetizer_c(nreader, nti) { generic_packetizer_c(nreader, nti) {
idx_data = (unsigned char *)safememdup(nidx_data, nidx_data_size); idx_data = (unsigned char *)safememdup(nidx_data, nidx_data_size);

View File

@ -37,7 +37,7 @@ private:
public: public:
vobsub_packetizer_c(generic_reader_c *nreader, vobsub_packetizer_c(generic_reader_c *nreader,
const void *nidx_data, int nidx_data_size, const void *nidx_data, int nidx_data_size,
bool nextract_from_mpeg, track_info_t *nti) bool nextract_from_mpeg, track_info_c *nti)
throw (error_c); throw (error_c);
virtual ~vobsub_packetizer_c(); virtual ~vobsub_packetizer_c();

View File

@ -43,7 +43,7 @@ vorbis_packetizer_c::vorbis_packetizer_c(generic_reader_c *nreader,
unsigned char *d_comments, unsigned char *d_comments,
int l_comments, int l_comments,
unsigned char *d_codecsetup, unsigned char *d_codecsetup,
int l_codecsetup, track_info_t *nti) int l_codecsetup, track_info_c *nti)
throw (error_c): generic_packetizer_c(nreader, nti) { throw (error_c): generic_packetizer_c(nreader, nti) {
int i; int i;

View File

@ -44,7 +44,7 @@ public:
unsigned char *d_header, int l_header, unsigned char *d_header, int l_header,
unsigned char *d_comments, int l_comments, unsigned char *d_comments, int l_comments,
unsigned char *d_codecsetup, int l_codecsetup, unsigned char *d_codecsetup, int l_codecsetup,
track_info_t *nti) throw (error_c); track_info_c *nti) throw (error_c);
virtual ~vorbis_packetizer_c(); virtual ~vorbis_packetizer_c();
virtual int process(unsigned char *data, int size, int64_t timecode = -1, virtual int process(unsigned char *data, int size, int64_t timecode = -1,

View File

@ -37,7 +37,7 @@
using namespace std; using namespace std;
generic_packetizer_c::generic_packetizer_c(generic_reader_c *nreader, generic_packetizer_c::generic_packetizer_c(generic_reader_c *nreader,
track_info_t *nti) throw(error_c) { track_info_c *nti) throw(error_c) {
int i; int i;
audio_sync_t *as; audio_sync_t *as;
cue_creation_t *cc; cue_creation_t *cc;
@ -56,7 +56,7 @@ generic_packetizer_c::generic_packetizer_c(generic_reader_c *nreader,
duplicate_data = true; duplicate_data = true;
track_entry = NULL; track_entry = NULL;
ti = duplicate_track_info(nti); ti = new track_info_c(*nti);
free_refs = -1; free_refs = -1;
enqueued_bytes = 0; enqueued_bytes = 0;
safety_last_timecode = 0; safety_last_timecode = 0;
@ -224,7 +224,7 @@ generic_packetizer_c::generic_packetizer_c(generic_reader_c *nreader,
} }
generic_packetizer_c::~generic_packetizer_c() { generic_packetizer_c::~generic_packetizer_c() {
free_track_info(ti); delete ti;
safefree(hcodec_id); safefree(hcodec_id);
safefree(hcodec_private); safefree(hcodec_private);
@ -926,12 +926,12 @@ void generic_packetizer_c::displace(float by_ms) {
//-------------------------------------------------------------------- //--------------------------------------------------------------------
generic_reader_c::generic_reader_c(track_info_t *nti) { generic_reader_c::generic_reader_c(track_info_c *nti) {
ti = duplicate_track_info(nti); ti = new track_info_c(*nti);
} }
generic_reader_c::~generic_reader_c() { generic_reader_c::~generic_reader_c() {
free_track_info(ti); delete ti;
} }
bool generic_reader_c::demuxing_requested(char type, int64_t id) { bool generic_reader_c::demuxing_requested(char type, int64_t id) {
@ -967,98 +967,168 @@ bool generic_reader_c::demuxing_requested(char type, int64_t id) {
//-------------------------------------------------------------------- //--------------------------------------------------------------------
track_info_t *duplicate_track_info(track_info_t *src) { track_info_c::track_info_c():
track_info_t *dst; initialized(true),
int i; id(0), fname(NULL),
no_audio(false), no_video(false), no_subs(false),
private_data(NULL), private_size(0),
aspect_ratio(0.0), display_width(0), display_height(0),
aspect_ratio_given(false), display_dimensions_given(false),
cues(0), default_track(false), language(NULL), sub_charset(NULL),
tags_ptr(NULL), tags(NULL),
compression(COMPRESSION_NONE),
track_name(NULL), ext_timecodes(NULL),
no_chapters(false), no_attachments(false), no_tags(false) {
atracks = new vector<int64_t>;
vtracks = new vector<int64_t>;
stracks = new vector<int64_t>;
if (src == NULL) all_fourccs = new vector<fourcc_t>;
return NULL; memset(fourcc, 0, 5);
display_properties = new vector<display_properties_t>;
dst = (track_info_t *)safememdup(src, sizeof(track_info_t)); audio_syncs = new vector<audio_sync_t>;
dst->fname = safestrdup(src->fname); cue_creations = new vector<cue_creation_t>;
dst->atracks = new vector<int64_t>(*src->atracks); default_track_flags = new vector<int64_t>;
dst->vtracks = new vector<int64_t>(*src->vtracks); languages = new vector<language_t>;
dst->stracks = new vector<int64_t>(*src->stracks); sub_charsets = new vector<language_t>;
dst->audio_syncs = new vector<audio_sync_t>(*src->audio_syncs); all_tags = new vector<tags_t>;
dst->cue_creations = new vector<cue_creation_t>(*src->cue_creations); aac_is_sbr = new vector<int64_t>;
dst->default_track_flags = new vector<int64_t>(*src->default_track_flags); compression_list = new vector<cue_creation_t>;
dst->languages = new vector<language_t>(*src->languages); track_names = new vector<language_t>;
for (i = 0; i < src->languages->size(); i++) all_ext_timecodes = new vector<language_t>;
(*dst->languages)[i].language = safestrdup((*src->languages)[i].language);
dst->language = safestrdup(src->language);
dst->sub_charsets = new vector<language_t>(*src->sub_charsets);
for (i = 0; i < src->sub_charsets->size(); i++)
(*dst->sub_charsets)[i].language =
safestrdup((*src->sub_charsets)[i].language);
dst->sub_charset = safestrdup(src->sub_charset);
dst->all_tags = new vector<tags_t>(*src->all_tags);
for (i = 0; i < src->all_tags->size(); i++)
(*dst->all_tags)[i].file_name = safestrdup((*src->all_tags)[i].file_name);
dst->aac_is_sbr = new vector<int64_t>(*src->aac_is_sbr);
dst->private_data = (unsigned char *)safememdup(src->private_data,
src->private_size);
dst->compression_list = new vector<cue_creation_t>(*src->compression_list);
dst->track_names = new vector<language_t>(*src->track_names);
for (i = 0; i < src->track_names->size(); i++)
(*dst->track_names)[i].language =
safestrdup((*src->track_names)[i].language);
dst->track_name = safestrdup(src->track_name);
dst->all_ext_timecodes = new vector<language_t>(*src->all_ext_timecodes);
for (i = 0; i < src->all_ext_timecodes->size(); i++)
(*dst->all_ext_timecodes)[i].language =
safestrdup((*src->all_ext_timecodes)[i].language);
dst->ext_timecodes = safestrdup(src->ext_timecodes);
dst->tags = NULL;
dst->all_fourccs = new vector<fourcc_t>(*src->all_fourccs);
dst->fourcc[0] = 0;
dst->display_properties =
new vector<display_properties_t>(*src->display_properties);
dst->aspect_ratio_given = false;
dst->display_dimensions_given = false;
return dst;
} }
void free_track_info(track_info_t *ti) { track_info_c::track_info_c(const track_info_c &src):
int i; initialized(false) {
*this = src;
}
if (ti == NULL) track_info_c::~track_info_c() {
free_contents();
}
void track_info_c::free_contents() {
uint32_t i;
if (!initialized)
return; return;
safefree(ti->fname); safefree(fname);
delete ti->atracks; delete atracks;
delete ti->vtracks; delete vtracks;
delete ti->stracks; delete stracks;
delete ti->audio_syncs; delete audio_syncs;
delete ti->cue_creations; delete cue_creations;
delete ti->default_track_flags; delete default_track_flags;
for (i = 0; i < ti->languages->size(); i++) for (i = 0; i < languages->size(); i++)
safefree((*ti->languages)[i].language); safefree((*languages)[i].language);
delete ti->languages; delete languages;
safefree(ti->language); safefree(language);
for (i = 0; i < ti->sub_charsets->size(); i++) for (i = 0; i < sub_charsets->size(); i++)
safefree((*ti->sub_charsets)[i].language); safefree((*sub_charsets)[i].language);
delete ti->sub_charsets; delete sub_charsets;
safefree(ti->sub_charset); safefree(sub_charset);
for (i = 0; i < ti->all_tags->size(); i++) for (i = 0; i < all_tags->size(); i++)
safefree((*ti->all_tags)[i].file_name); safefree((*all_tags)[i].file_name);
delete ti->all_tags; delete all_tags;
delete ti->aac_is_sbr; delete aac_is_sbr;
delete ti->compression_list; delete compression_list;
for (i = 0; i < ti->track_names->size(); i++) for (i = 0; i < track_names->size(); i++)
safefree((*ti->track_names)[i].language); safefree((*track_names)[i].language);
delete ti->track_names; delete track_names;
safefree(ti->track_name); safefree(track_name);
for (i = 0; i < ti->all_ext_timecodes->size(); i++) for (i = 0; i < all_ext_timecodes->size(); i++)
safefree((*ti->all_ext_timecodes)[i].language); safefree((*all_ext_timecodes)[i].language);
delete ti->all_ext_timecodes; delete all_ext_timecodes;
safefree(ti->ext_timecodes); safefree(ext_timecodes);
safefree(ti->private_data); safefree(private_data);
if (ti->tags != NULL) if (tags != NULL)
delete ti->tags; delete tags;
delete ti->all_fourccs; delete all_fourccs;
delete ti->display_properties; delete display_properties;
safefree(ti);
initialized = false;
}
track_info_c &track_info_c::operator =(const track_info_c &src) {
uint32_t i;
free_contents();
id = src.id;
fname = safestrdup(src.fname);
no_audio = src.no_audio;
no_video = src.no_video;
no_subs = src.no_subs;
atracks = new vector<int64_t>(*src.atracks);
vtracks = new vector<int64_t>(*src.vtracks);
stracks = new vector<int64_t>(*src.stracks);
private_size = src.private_size;
private_data = (unsigned char *)safememdup(src.private_data, private_size);
all_fourccs = new vector<fourcc_t>(*src.all_fourccs);
memcpy(fourcc, src.fourcc, 5);
display_properties =
new vector<display_properties_t>(*src.display_properties);
aspect_ratio = src.aspect_ratio;
aspect_ratio_given = false;
display_dimensions_given = false;
audio_syncs = new vector<audio_sync_t>(*src.audio_syncs);
memcpy(&async, &src.async, sizeof(audio_sync_t));
cue_creations = new vector<cue_creation_t>(*src.cue_creations);
cues = src.cues;
default_track_flags = new vector<int64_t>(*src.default_track_flags);
default_track = src.default_track;
languages = new vector<language_t>(*src.languages);
for (i = 0; i < src.languages->size(); i++)
(*languages)[i].language = safestrdup((*src.languages)[i].language);
language = safestrdup(src.language);
sub_charsets = new vector<language_t>(*src.sub_charsets);
for (i = 0; i < src.sub_charsets->size(); i++)
(*sub_charsets)[i].language =
safestrdup((*src.sub_charsets)[i].language);
sub_charset = safestrdup(src.sub_charset);
all_tags = new vector<tags_t>(*src.all_tags);
for (i = 0; i < src.all_tags->size(); i++)
(*all_tags)[i].file_name = safestrdup((*src.all_tags)[i].file_name);
tags_ptr = src.tags_ptr;
tags = NULL;
// tags = src.tags;
aac_is_sbr = new vector<int64_t>(*src.aac_is_sbr);
compression_list = new vector<cue_creation_t>(*src.compression_list);
compression = src.compression;
track_names = new vector<language_t>(*src.track_names);
for (i = 0; i < src.track_names->size(); i++)
(*track_names)[i].language =
safestrdup((*src.track_names)[i].language);
track_name = safestrdup(src.track_name);
all_ext_timecodes = new vector<language_t>(*src.all_ext_timecodes);
for (i = 0; i < src.all_ext_timecodes->size(); i++)
(*all_ext_timecodes)[i].language =
safestrdup((*src.all_ext_timecodes)[i].language);
ext_timecodes = safestrdup(src.ext_timecodes);
no_chapters = src.no_chapters;
no_attachments = src.no_attachments;
no_tags = src.no_tags;
initialized = true;
return *this;
} }
struct ltstr { struct ltstr {
@ -1068,7 +1138,7 @@ struct ltstr {
}; };
static map<const char *, string, ltstr> pass_data; static map<const char *, string, ltstr> pass_data;
void set_pass_data(track_info_t *ti, unsigned char *data, int size) { void set_pass_data(track_info_c *ti, unsigned char *data, int size) {
string key, value; string key, value;
key = string(ti->fname) + string("::") + to_string(ti->id); key = string(ti->fname) + string("::") + to_string(ti->id);
@ -1078,7 +1148,7 @@ void set_pass_data(track_info_t *ti, unsigned char *data, int size) {
pass_data[key.c_str()] = value; pass_data[key.c_str()] = value;
} }
unsigned char *retrieve_pass_data(track_info_t *ti, int &size) { unsigned char *retrieve_pass_data(track_info_c *ti, int &size) {
map<const char *, string, ltstr>::iterator it; map<const char *, string, ltstr>::iterator it;
string key, value; string key, value;
unsigned char *data; unsigned char *data;

View File

@ -87,7 +87,10 @@ typedef struct {
int64_t id; int64_t id;
} fourcc_t; } fourcc_t;
typedef struct { class track_info_c {
protected:
bool initialized;
public:
// The track ID. // The track ID.
int64_t id; int64_t id;
@ -138,7 +141,15 @@ typedef struct {
char *ext_timecodes; // For this very track char *ext_timecodes; // For this very track
bool no_chapters, no_attachments, no_tags; bool no_chapters, no_attachments, no_tags;
} track_info_t;
public:
track_info_c();
track_info_c(const track_info_c &src);
virtual ~track_info_c();
track_info_c &operator =(const track_info_c &src);
virtual void free_contents();
};
class timecode_range_c { class timecode_range_c {
public: public:
@ -158,7 +169,7 @@ protected:
generic_reader_c *reader; generic_reader_c *reader;
bool duplicate_data; bool duplicate_data;
track_info_t *ti; track_info_c *ti;
int64_t initial_displacement; int64_t initial_displacement;
int64_t free_refs, enqueued_bytes, safety_last_timecode; int64_t free_refs, enqueued_bytes, safety_last_timecode;
@ -191,7 +202,7 @@ protected:
int ext_timecodes_version; int ext_timecodes_version;
public: public:
generic_packetizer_c(generic_reader_c *nreader, track_info_t *nti) generic_packetizer_c(generic_reader_c *nreader, track_info_c *nti)
throw (error_c); throw (error_c);
virtual ~generic_packetizer_c(); virtual ~generic_packetizer_c();
@ -272,9 +283,9 @@ protected:
class generic_reader_c { class generic_reader_c {
protected: protected:
track_info_t *ti; track_info_c *ti;
public: public:
generic_reader_c(track_info_t *nti); generic_reader_c(track_info_c *nti);
virtual ~generic_reader_c(); virtual ~generic_reader_c();
virtual int read(generic_packetizer_c *ptzr) = 0; virtual int read(generic_packetizer_c *ptzr) = 0;
virtual int display_priority() = 0; virtual int display_priority() = 0;
@ -290,9 +301,9 @@ protected:
virtual bool demuxing_requested(char type, int64_t id); virtual bool demuxing_requested(char type, int64_t id);
}; };
track_info_t *duplicate_track_info(track_info_t *src); track_info_c *duplicate_track_info(track_info_c *src);
void free_track_info(track_info_t *ti); void free_track_info(track_info_c *ti);
void set_pass_data(track_info_t *ti, unsigned char *data, int size); void set_pass_data(track_info_c *ti, unsigned char *data, int size);
unsigned char *retrieve_pass_data(track_info_t *ti, int &size); unsigned char *retrieve_pass_data(track_info_c *ti, int &size);
#endif // __PR_GENERIC_H #endif // __PR_GENERIC_H