100l: Cannot return a pointer to space that I frequently realloc (rmff_add_track). Changed rmff_file_t->tracks from rmff_track_t * to rmff_track_t **. Docs update. Added #defines for file and frame flags.

This commit is contained in:
Moritz Bunkus 2004-03-21 16:13:44 +00:00
parent a4abb1de79
commit 938bdcce90
2 changed files with 59 additions and 32 deletions

View File

@ -120,6 +120,16 @@ extern "C" {
#include "mb_file_io.h"
/** \brief The stream may be saved to disc. Can be set in the
\link ::rmff_prop_t PROP header\endlink. */
#define RMFF_FILE_FLAG_SAVE_ENABLED 0x0001
/** \brief Allows the client to use extra buffering. Can be set in the
\link ::rmff_prop_t PROP header\endlink. */
#define RMFF_FILE_FLAG_PERFECT_PLAY 0x0002
/** \brief The stream is being generated by a live broadcast. Can be set in the
\link ::rmff_prop_t PROP header\endlink. */
#define RMFF_FILE_FLAG_LIVE_BROADCAST 0x0004
/** \brief The global PROP file header.
This header is mandatory for a RealMedia file. It contains statistical
@ -273,6 +283,13 @@ typedef struct rmff_index_entry_t {
uint32_t packet_number;
} rmff_index_entry_t;
/** \brief The packet is being delivered reliably. Can be set in the
::rmff_frame_t#flags member. */
#define RMFF_FRAME_FLAG_RELIABLE 0x01
/** \brief The frame is a key frame. Can be set in the ::rmff_frame_t#flags
member. */
#define RMFF_FRAME_FLAG_KEYFRAME 0x02
/** A frame or packet of media data.
A new frame can be obtained with ::rmff_allocate_frame or read from a file
@ -341,7 +358,7 @@ typedef struct rmff_file_t {
uint32_t num_packets_in_chunk;
uint32_t num_packets_read;
rmff_track_t *tracks;
rmff_track_t **tracks;
int num_tracks;
void *app_data;
@ -502,6 +519,8 @@ rmff_track_t *rmff_add_track(rmff_file_t *file, int create_index);
values, especially the \c uknown fields. Should be used after
::rmff_add_track.
\note This function has not been implemented yet.
\param props A pointer to the structure whose values should be set.
\see rmff_set_std_audio_v5_values(real_audio_v5_props_t*),
@ -515,6 +534,8 @@ void rmff_set_std_audio_v4_values(real_audio_v4_props_t *props);
values, especially the \c uknown fields. Should be used after
::rmff_add_track.
\note This function has not been implemented yet.
\param props A pointer to the structure whose values should be set.
\see rmff_set_std_audio_v4_values(real_audio_v5_props_t*),
@ -528,6 +549,8 @@ void rmff_set_std_audio_v5_values(real_audio_v5_props_t *props);
values, especially the \c uknown fields. Should be used after
::rmff_add_track.
\note This function has not been implemented yet.
\param props A pointer to the structure whose values should be set.
\see rmff_set_std_audio_v4_values(real_audio_v4_props_t*),

View File

@ -363,7 +363,9 @@ open_file_for_writing(const char *path,
file->internal = safecalloc(sizeof(rmff_file_internal_t));
/* save allowed & perfect play */
rmff_put_uint16_be(&file->prop_header.flags, 1 | 2);
rmff_put_uint16_be(&file->prop_header.flags,
RMFF_FILE_FLAG_SAVE_ENABLED |
RMFF_FILE_FLAG_PERFECT_PLAY);
clear_error();
return file;
@ -407,8 +409,10 @@ rmff_close_file(rmff_file_t *file) {
return;
safefree(file->name);
for (i = 0; i < file->num_tracks; i++)
rmff_free_track_data(&file->tracks[i]);
for (i = 0; i < file->num_tracks; i++) {
rmff_free_track_data(file->tracks[i]);
safefree(file->tracks[i]);
}
safefree(file->tracks);
safefree(file->cont_header.title);
safefree(file->cont_header.author);
@ -496,7 +500,7 @@ rmff_read_headers(rmff_file_t *file) {
rmff_prop_t *prop;
rmff_cont_t *cont;
rmff_mdpr_t *mdpr;
rmff_track_t track;
rmff_track_t *track;
real_video_props_t *rvp;
real_audio_v4_props_t *ra4p;
rmff_file_internal_t *fint;
@ -576,11 +580,11 @@ rmff_read_headers(rmff_file_t *file) {
file->cont_header_present = 1;
} else if (object_id == rmffFOURCC('M', 'D', 'P', 'R')) {
memset(&track, 0, sizeof(rmff_track_t));
track.file = (struct rmff_file_t *)file;
mdpr = &track.mdpr_header;
track = (rmff_track_t *)safecalloc(sizeof(rmff_track_t));
track->file = (struct rmff_file_t *)file;
mdpr = &track->mdpr_header;
read_uint16_be_to(&mdpr->id);
track.id = rmff_get_uint16_be(&mdpr->id);
track->id = rmff_get_uint16_be(&mdpr->id);
read_uint32_be_to(&mdpr->max_bit_rate);
read_uint32_be_to(&mdpr->avg_bit_rate);
read_uint32_be_to(&mdpr->max_packet_size);
@ -609,21 +613,21 @@ rmff_read_headers(rmff_file_t *file) {
ra4p = (real_audio_v4_props_t *)mdpr->type_specific_data;
if ((size >= sizeof(real_video_props_t)) &&
(get_fourcc(&rvp->fourcc1) == rmffFOURCC('V', 'I', 'D', 'O')))
track.type = RMFF_TRACK_TYPE_VIDEO;
track->type = RMFF_TRACK_TYPE_VIDEO;
else if ((size >= sizeof(real_audio_v4_props_t)) &&
(get_fourcc(&ra4p->fourcc1) ==
rmffFOURCC('.', 'r', 'a', 0xfd))) {
track.type = RMFF_TRACK_TYPE_AUDIO;
track->type = RMFF_TRACK_TYPE_AUDIO;
if ((rmff_get_uint16_be(&ra4p->version1) == 5) &&
(size < sizeof(real_audio_v5_props_t)))
return set_error(RMFF_ERR_DATA, "RealAudio v5 data indicated but "
"data too small", RMFF_ERR_DATA);
}
track.internal = safecalloc(sizeof(rmff_track_internal_t));
track->internal = safecalloc(sizeof(rmff_track_internal_t));
file->tracks =
(rmff_track_t *)saferealloc(file->tracks, (file->num_tracks + 1) *
sizeof(rmff_track_t));
(rmff_track_t **)saferealloc(file->tracks, (file->num_tracks + 1) *
sizeof(rmff_track_t *));
file->tracks[file->num_tracks] = track;
file->num_tracks++;
@ -799,7 +803,7 @@ rmff_set_track_data(rmff_track_t *track,
}
void
rmff_set_track_specific_data(rmff_track_t *track,
rmff_set_type_specific_data(rmff_track_t *track,
const unsigned char *data,
uint32_t size) {
if (track == NULL)
@ -815,7 +819,7 @@ rmff_set_track_specific_data(rmff_track_t *track,
rmff_track_t *
rmff_add_track(rmff_file_t *file,
int create_index) {
rmff_track_t track;
rmff_track_t *track;
rmff_track_internal_t *tint;
int i, id, found;
@ -826,27 +830,27 @@ rmff_add_track(rmff_file_t *file,
do {
found = 0;
for (i = 0; i < file->num_tracks; i++)
if (file->tracks[i].id == id) {
if (file->tracks[i]->id == id) {
found = 1;
id++;
break;
}
} while (found);
memset(&track, 0, sizeof(rmff_track_t));
track.id = id;
track.file = file;
track = (rmff_track_t *)safecalloc(sizeof(rmff_track_t));
track->id = id;
track->file = file;
tint = (rmff_track_internal_t *)safecalloc(sizeof(rmff_track_internal_t));
tint->index_this = create_index;
track.internal = tint;
track->internal = tint;
file->tracks =
(rmff_track_t *)saferealloc(file->tracks, (file->num_tracks + 1) *
sizeof(rmff_track_t));
(rmff_track_t **)saferealloc(file->tracks, (file->num_tracks + 1) *
sizeof(rmff_track_t *));
file->tracks[file->num_tracks] = track;
file->num_tracks++;
return &file->tracks[file->num_tracks - 1];
return track;
}
void
@ -1075,7 +1079,7 @@ rmff_write_headers(rmff_file_t *file) {
}
for (i = 0; i < file->num_tracks; i++) {
bw = write_mdpr_header(&file->tracks[i]);
bw = write_mdpr_header(file->tracks[i]);
if (bw < RMFF_ERR_OK)
return bw;
}
@ -1119,7 +1123,7 @@ rmff_fix_headers(rmff_file_t *file) {
rmff_put_uint16_be(&prop->num_streams, file->num_tracks);
for (i = 0; i < file->num_tracks; i++) {
track = &file->tracks[i];
track = file->tracks[i];
mdpr = &track->mdpr_header;
tint = (rmff_track_internal_t *)track->internal;
@ -1238,8 +1242,8 @@ rmff_find_track_with_id(rmff_file_t *file,
if (file == 0)
return (rmff_track_t *)set_error(RMFF_ERR_PARAMETERS, NULL, 0);
for (i = 0; i < file->num_tracks; i++)
if (file->tracks[i].id == id)
return &file->tracks[i];
if (file->tracks[i]->id == id)
return file->tracks[i];
return NULL;
}
@ -1262,7 +1266,7 @@ rmff_write_index(rmff_file_t *file) {
fint->num_index_chunks = 0;
for (i = 0; i < file->num_tracks; i++)
if (file->tracks[i].num_index_entries > 0)
if (file->tracks[i]->num_index_entries > 0)
fint->num_index_chunks++;
if (fint->num_index_chunks == 0)
@ -1271,7 +1275,7 @@ rmff_write_index(rmff_file_t *file) {
io->seek(fh, 0, SEEK_END);
for (i = 0; i < file->num_tracks; i++) {
track = &file->tracks[i];
track = file->tracks[i];
tint = (rmff_track_internal_t *)track->internal;
if (track->num_index_entries > 0) {
pos = io->tell(fh);