#include "dash-mpd.h" #include "dash-proto.h" #include "mov-format.h" #include "mov-reader.h" #include #include #include extern "C" const struct mov_buffer_t* mov_file_buffer(void); static char s_packet[2 * 1024 * 1024]; static uint32_t s_track_video; static uint32_t s_track_audio; static int s_adapation_video; static int s_adapation_audio; static void mp4_onvideo(void* mpd, uint32_t track, uint8_t object, int width, int height, const void* extra, size_t bytes) { s_track_video = track; s_adapation_video = dash_mpd_add_video_adaptation_set((dash_mpd_t*)mpd, "dash-static-video", object, width, height, extra, bytes); } static void mp4_onaudio(void* mpd, uint32_t track, uint8_t object, int channel_count, int bit_per_sample, int sample_rate, const void* extra, size_t bytes) { s_track_audio = track; s_adapation_audio = dash_mpd_add_audio_adaptation_set((dash_mpd_t*)mpd, "dash-static-audio", object, channel_count, bit_per_sample, sample_rate, extra, bytes); } static void mp4_onread(void* mpd, uint32_t track, const void* buffer, size_t bytes, int64_t pts, int64_t dts, int flags) { if (s_track_video == track) { bool keyframe = 5 == (0x1f & ((uint8_t*)buffer)[4]); dash_mpd_input((dash_mpd_t*)mpd, s_adapation_video, buffer, bytes, pts, dts, keyframe ? MOV_AV_FLAG_KEYFREAME : 0); } else if (s_track_audio == track) { dash_mpd_input((dash_mpd_t*)mpd, s_adapation_audio, buffer, bytes, pts, dts, 0); } else { assert(0); } } static int dash_mpd_onsegment(void* /*param*/, int /*track*/, const void* data, size_t bytes, int64_t /*pts*/, int64_t /*dts*/, int64_t /*duration*/, const char* name) { FILE* fp = fopen(name, "wb"); fwrite(data, 1, bytes, fp); fclose(fp); return 0; } static void dash_save_playlist(const char* name, const char* playlist) { char filename[256]; snprintf(filename, sizeof(filename), "%s.mpd", name); FILE* fp = fopen(filename, "wb"); fwrite(playlist, 1, strlen(playlist), fp); fclose(fp); } void dash_static_test(const char* mp4, const char* name) { FILE* fp = fopen(mp4, "rb"); mov_reader_t* mov = mov_reader_create(mov_file_buffer(), fp); dash_mpd_t* mpd = dash_mpd_create(DASH_STATIC, dash_mpd_onsegment, NULL); struct mov_reader_trackinfo_t info = { mp4_onvideo, mp4_onaudio }; mov_reader_getinfo(mov, &info, mpd); int r = mov_reader_read(mov, s_packet, sizeof(s_packet), mp4_onread, mpd); while (1 == r) { r = mov_reader_read(mov, s_packet, sizeof(s_packet), mp4_onread, mpd); } //flush dash_mpd_input(mpd, s_adapation_video, NULL, 0, 0, 0, 0); dash_mpd_playlist(mpd, s_packet, sizeof(s_packet)); dash_save_playlist(name, s_packet); dash_mpd_destroy(mpd); mov_reader_destroy(mov); fclose(fp); }