bool RmReader::Initialize() { assert(file == NULL); file = rmff_open_file(fileName.c_str(),MB_OPEN_MODE_READING); if( file == NULL) { return false; } if( rmff_read_headers(file) != RMFF_ERR_OK ) { return false; } MakeFrameIndex(); return true; }
void real_reader_c::parse_headers() { if (rmff_read_headers(file) != RMFF_ERR_OK) return; int ndx; for (ndx = 0; ndx < file->num_tracks; ndx++) { rmff_track_t *track = file->tracks[ndx]; if ((RMFF_TRACK_TYPE_UNKNOWN == track->type) || (get_uint32_be(&track->mdpr_header.type_specific_size) == 0)) continue; if ((RMFF_TRACK_TYPE_VIDEO == track->type) && !demuxing_requested('v', track->id)) continue; if ((RMFF_TRACK_TYPE_AUDIO == track->type) && !demuxing_requested('a', track->id)) continue; if ((NULL == track->mdpr_header.mime_type) || ( strcmp(track->mdpr_header.mime_type, "audio/x-pn-realaudio") && strcmp(track->mdpr_header.mime_type, "video/x-pn-realvideo"))) continue; unsigned char *ts_data = track->mdpr_header.type_specific_data; uint32_t ts_size = get_uint32_be(&track->mdpr_header.type_specific_size); real_demuxer_cptr dmx(new real_demuxer_t(track)); if (RMFF_TRACK_TYPE_VIDEO == track->type) { dmx->rvp = (real_video_props_t *)track->mdpr_header.type_specific_data; memcpy(dmx->fourcc, &dmx->rvp->fourcc2, 4); dmx->fourcc[4] = 0; dmx->width = get_uint16_be(&dmx->rvp->width); dmx->height = get_uint16_be(&dmx->rvp->height); uint32_t i = get_uint32_be(&dmx->rvp->fps); dmx->fps = (float)((i & 0xffff0000) >> 16) + ((float)(i & 0x0000ffff)) / 65536.0; dmx->private_data = (unsigned char *)safememdup(ts_data, ts_size); dmx->private_size = ts_size; demuxers.push_back(dmx); } else if (RMFF_TRACK_TYPE_AUDIO == track->type) {