int quicktime_set_video(quicktime_t *file, int tracks, int frame_w, int frame_h, double frame_rate, char *compressor) { int i; quicktime_trak_t *trak; if(tracks) { quicktime_mhvd_init_video(file, &(file->moov.mvhd), frame_rate); file->total_vtracks = tracks; file->vtracks = (quicktime_video_map_t*)calloc(1, sizeof(quicktime_video_map_t) * file->total_vtracks); for(i = 0; i < tracks; i++) { trak = quicktime_add_track(file); quicktime_trak_init_video(file, trak, frame_w, frame_h, frame_rate, compressor); quicktime_init_video_map(&(file->vtracks[i]), trak); } } return 0; }
int quicktime_set_audio(quicktime_t *file, int channels, long sample_rate, int bits, char *compressor) { quicktime_trak_t *trak; /* allocate an arbitrary number of tracks */ if(channels) { /* Fake the bits parameter for some formats. */ if(quicktime_match_32(compressor, QUICKTIME_ULAW) || quicktime_match_32(compressor, QUICKTIME_IMA4)) bits = 16; file->atracks = (quicktime_audio_map_t*)calloc(1, sizeof(quicktime_audio_map_t)); trak = quicktime_add_track(file); quicktime_trak_init_audio(file, trak, channels, sample_rate, bits, compressor); quicktime_init_audio_map(&(file->atracks[0]), trak); file->atracks[file->total_atracks].track = trak; file->atracks[file->total_atracks].channels = channels; file->atracks[file->total_atracks].current_position = 0; file->atracks[file->total_atracks].current_chunk = 1; file->total_atracks++; } return 1; /* Return the number of tracks created */ }
int quicktime_set_audio_hint(quicktime_t *file, int audioTrack, char *payloadName, u_int* pPayloadNumber, int maxPktSize) { quicktime_audio_map_t* pMap = NULL; quicktime_trak_t* hintTrak = NULL; int timeScale; float frameRate; int sampleDuration; char rtpMapBuf[128]; char sdpBuf[256]; /* check our arguments */ if (file == NULL) { return -1; } if (audioTrack < 0 || audioTrack > file->total_atracks) { return -1; } if (payloadName == NULL) { return -1; } pMap = &file->atracks[audioTrack]; timeScale = quicktime_audio_time_scale(file, audioTrack); if (timeScale == 0) { return -1; } sampleDuration = file->atracks[audioTrack].track->mdia.minf.stbl.stts.table[0].sample_duration; /* add the hint track */ hintTrak = quicktime_add_track(&(file->moov)); if (*pPayloadNumber == 0) { (*pPayloadNumber) = 96 + file->total_hint_tracks++; } /* initialize it to reference the audio track */ quicktime_trak_init_hint(file, hintTrak, pMap->track, maxPktSize, timeScale, sampleDuration); /* set the payload info */ hintTrak->hint_udta.hinf.payt.payloadNumber = *pPayloadNumber; sprintf(rtpMapBuf, "%s/%u", payloadName, timeScale); strcpy(hintTrak->hint_udta.hinf.payt.rtpMapString, rtpMapBuf); /* set the SDP media section */ sprintf(sdpBuf, "m=audio 0 RTP/AVP %u\015\012a=rtpmap:%u %s\015\012a=control:trackID=%u\015\012", *pPayloadNumber, *pPayloadNumber, rtpMapBuf, hintTrak->tkhd.track_id); quicktime_sdp_set(&(hintTrak->hint_udta.hnti.sdp), sdpBuf); pMap->hintTracks[pMap->totalHintTracks] = hintTrak; pMap->hintPositions[pMap->totalHintTracks] = 0; pMap->totalHintTracks++; return (pMap->totalHintTracks - 1); }
int quicktime_set_audio(quicktime_t *file, int channels, long sample_rate, int bits, int sample_size, int time_scale, int sample_duration, char *compressor) { int i, j; quicktime_trak_t *trak; /* delete any existing tracks */ for(i = 0; i < file->total_atracks; i++) { for (j = 0; j < file->atracks[i].totalHintTracks; j++) { quicktime_delete_trak(&(file->moov), file->atracks[i].hintTracks[j]); free(file->atracks[i].hintTracks[j]); file->atracks[i].hintTracks[j] = NULL; file->total_hint_tracks--; } quicktime_delete_audio_map(&(file->atracks[i])); quicktime_delete_trak(&(file->moov), file->atracks[i].track); } free(file->atracks); file->atracks = NULL; file->total_atracks = 0; if(channels) { /* Fake the bits parameter for some formats. */ if(quicktime_match_32(compressor, QUICKTIME_ULAW) || quicktime_match_32(compressor, QUICKTIME_IMA4)) bits = 16; file->atracks = (quicktime_audio_map_t*) calloc(1, sizeof(quicktime_audio_map_t)); trak = quicktime_add_track(&(file->moov)); quicktime_trak_init_audio(file, trak, channels, sample_rate, bits, sample_size, time_scale, sample_duration, compressor); quicktime_init_audio_map(&(file->atracks[0]), trak); file->atracks[file->total_atracks].track = trak; file->atracks[file->total_atracks].channels = channels; file->atracks[file->total_atracks].current_position = 0; file->atracks[file->total_atracks].current_chunk = 1; file->total_atracks++; } return 1; /* Return the number of tracks created */ }
int quicktime_set_video(quicktime_t *file, int tracks, int frame_w, int frame_h, float frame_rate, int time_scale, char *compressor) { int i, j; quicktime_trak_t *trak; /* delete any existing tracks */ for(i = 0; i < file->total_vtracks; i++) { for (j = 0; j < file->vtracks[i].totalHintTracks; j++) { quicktime_delete_trak(&(file->moov), file->vtracks[i].hintTracks[j]); file->vtracks[i].hintTracks[j] = NULL; file->total_hint_tracks--; } quicktime_delete_video_map(&(file->vtracks[i])); quicktime_delete_trak(&(file->moov), file->vtracks[i].track); } free(file->vtracks); file->vtracks = NULL; file->total_vtracks = 0; if (tracks > 0) { file->total_vtracks = tracks; file->vtracks = (quicktime_video_map_t*)calloc(1, sizeof(quicktime_video_map_t) * file->total_vtracks); for(i = 0; i < tracks; i++) { trak = quicktime_add_track(&(file->moov)); quicktime_trak_init_video(file, trak, frame_w, frame_h, frame_rate, time_scale, compressor); quicktime_init_video_map(&(file->vtracks[i]), trak); } } return 0; }
int quicktime_set_video_hint(quicktime_t *file, int videoTrack, char *payloadName, u_int* pPayloadNumber, int maxPktSize) { quicktime_video_map_t* pMap = NULL; quicktime_trak_t* hintTrak = NULL; float frameRate; int timeScale; int sampleDuration; char rtpMapBuf[128]; char sdpBuf[1024]; /* check our arguments */ if (file == NULL) { return -1; } if (videoTrack < 0 || videoTrack > file->total_vtracks) { return -1; } if (payloadName == NULL) { return -1; } frameRate = quicktime_video_frame_rate(file, videoTrack); if (frameRate == 0.0) { return -1; } timeScale = quicktime_video_time_scale(file, videoTrack); if (timeScale == 0) { return -1; } sampleDuration = timeScale / frameRate; if (sampleDuration == 0) { return -1; } /* add the hint track */ hintTrak = quicktime_add_track(&(file->moov)); if (*pPayloadNumber == 0) { (*pPayloadNumber) = 96 + file->total_hint_tracks++; } pMap = &file->vtracks[videoTrack]; /* initialize it to reference the video track */ quicktime_trak_init_hint(file, hintTrak, pMap->track, maxPktSize, timeScale, sampleDuration); /* set the payload info */ hintTrak->hint_udta.hinf.payt.payloadNumber = *pPayloadNumber; sprintf(rtpMapBuf, "%s/90000", payloadName); strcpy(hintTrak->hint_udta.hinf.payt.rtpMapString, rtpMapBuf); /* set the SDP media section */ sprintf(sdpBuf, "m=video 0 RTP/AVP %u\015\012a=rtpmap:%u %s\015\012a=control:trackID=%u\015\012", *pPayloadNumber, *pPayloadNumber, rtpMapBuf, hintTrak->tkhd.track_id); quicktime_sdp_set(&(hintTrak->hint_udta.hnti.sdp), sdpBuf); pMap->hintTracks[pMap->totalHintTracks] = hintTrak; pMap->hintPositions[pMap->totalHintTracks] = 0; pMap->totalHintTracks++; return (pMap->totalHintTracks - 1); }