From 938bdcce90d1800e38a22d129cf9a3e5d69d19c1 Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Sun, 21 Mar 2004 16:13:44 +0000 Subject: [PATCH] 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. --- librmff/librmff.h | 25 +++++++++++++++++- librmff/rmff.c | 66 +++++++++++++++++++++++++---------------------- 2 files changed, 59 insertions(+), 32 deletions(-) diff --git a/librmff/librmff.h b/librmff/librmff.h index 0a06ce217..d3f71ae1d 100644 --- a/librmff/librmff.h +++ b/librmff/librmff.h @@ -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*), diff --git a/librmff/rmff.c b/librmff/rmff.c index 71e22c1f8..137318755 100644 --- a/librmff/rmff.c +++ b/librmff/rmff.c @@ -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,9 +803,9 @@ rmff_set_track_data(rmff_track_t *track, } void -rmff_set_track_specific_data(rmff_track_t *track, - const unsigned char *data, - uint32_t size) { +rmff_set_type_specific_data(rmff_track_t *track, + const unsigned char *data, + uint32_t size) { if (track == NULL) return; if (data != track->mdpr_header.type_specific_data) { @@ -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);