stream-deploy/ZLM/3rdpart/media-server/libdash/test/dash-static-test.cpp

86 lines
2.7 KiB
C++

#include "dash-mpd.h"
#include "dash-proto.h"
#include "mov-format.h"
#include "mov-reader.h"
#include <assert.h>
#include <string.h>
#include <stdio.h>
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);
}