From ad3fc90c9f745d0cf053c32ddf93ff844ac8df56 Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Tue, 29 Oct 2013 12:45:03 +0200 Subject: Demux VP9 and HEVC from matroska --- src/demuxers/demux_matroska.c | 52 +++++++++++++++++++++++++++---------------- src/demuxers/matroska.h | 2 ++ 2 files changed, 35 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/demuxers/demux_matroska.c b/src/demuxers/demux_matroska.c index c7f2bdc66..6364dbe0d 100644 --- a/src/demuxers/demux_matroska.c +++ b/src/demuxers/demux_matroska.c @@ -1092,6 +1092,28 @@ static void handle_vobsub (demux_plugin_t *this_gen, matroska_track_t *track, free(data); } +static void fill_extra_data(matroska_track_t *track, uint32_t fourcc) { + + xine_bmiheader *bih; + + if (track->codec_private_len > 0x7fffffff - sizeof(xine_bmiheader)) + track->codec_private_len = 0x7fffffff - sizeof(xine_bmiheader); + + /* create a bitmap info header struct */ + bih = calloc(1, sizeof(xine_bmiheader) + track->codec_private_len); + bih->biSize = sizeof(xine_bmiheader) + track->codec_private_len; + bih->biCompression = fourcc; + bih->biWidth = track->video_track->pixel_width; + bih->biHeight = track->video_track->pixel_height; + _x_bmiheader_le2me(bih); + + /* add bih extra data */ + memcpy(bih + 1, track->codec_private, track->codec_private_len); + free(track->codec_private); + track->codec_private = (uint8_t *)bih; + track->codec_private_len = bih->biSize; +} + static int parse_track_entry(demux_matroska_t *this, matroska_track_t *track) { ebml_parser_t *ebml = this->ebml; int next_level = 3; @@ -1334,27 +1356,19 @@ static int parse_track_entry(demux_matroska_t *this, matroska_track_t *track) { track->buf_type = BUF_VIDEO_MPEG; init_codec = init_codec_video; } else if (!strcmp(track->codec_id, MATROSKA_CODEC_ID_V_VP8)) { - xine_bmiheader *bih; - lprintf("MATROSKA_CODEC_ID_V_VP8\n"); - if (track->codec_private_len > 0x7fffffff - sizeof(xine_bmiheader)) - track->codec_private_len = 0x7fffffff - sizeof(xine_bmiheader); - - /* create a bitmap info header struct for vp8 */ - bih = calloc(1, sizeof(xine_bmiheader) + track->codec_private_len); - bih->biSize = sizeof(xine_bmiheader) + track->codec_private_len; - bih->biCompression = ME_FOURCC('v', 'p', '8', '0'); - bih->biWidth = track->video_track->pixel_width; - bih->biHeight = track->video_track->pixel_height; - _x_bmiheader_le2me(bih); - - /* add bih extra data */ - memcpy(bih + 1, track->codec_private, track->codec_private_len); - free(track->codec_private); - track->codec_private = (uint8_t *)bih; - track->codec_private_len = bih->biSize; + fill_extra_data(track, ME_FOURCC('v', 'p', '8', '0')); track->buf_type = BUF_VIDEO_VP8; - + init_codec = init_codec_video; + } else if (!strcmp(track->codec_id, MATROSKA_CODEC_ID_V_VP9)) { + lprintf("MATROSKA_CODEC_ID_V_VP9\n"); + fill_extra_data(track, ME_FOURCC('v', 'p', '9', '0')); + track->buf_type = BUF_VIDEO_VP9; + init_codec = init_codec_video; + } else if (!strcmp(track->codec_id, MATROSKA_CODEC_ID_V_HEVC)) { + lprintf("MATROSKA_CODEC_ID_V_HEVC\n"); + fill_extra_data(track, ME_FOURCC('h', 'e', 'v', 'c')); + track->buf_type = BUF_VIDEO_HEVC; init_codec = init_codec_video; } else if (!strcmp(track->codec_id, MATROSKA_CODEC_ID_V_REAL_RV10)) { } else if (!strcmp(track->codec_id, MATROSKA_CODEC_ID_V_REAL_RV20)) { diff --git a/src/demuxers/matroska.h b/src/demuxers/matroska.h index c608a0646..68a8dbd55 100644 --- a/src/demuxers/matroska.h +++ b/src/demuxers/matroska.h @@ -315,6 +315,8 @@ struct matroska_track_s { #define MATROSKA_CODEC_ID_V_MJPEG "V_MJPEG" #define MATROSKA_CODEC_ID_V_THEORA "V_THEORA" #define MATROSKA_CODEC_ID_V_VP8 "V_VP8" +#define MATROSKA_CODEC_ID_V_VP9 "V_VP9" +#define MATROSKA_CODEC_ID_V_HEVC "V_MPEGH/ISO/HEVC" #define MATROSKA_CODEC_ID_A_MPEG1_L1 "A_MPEG/L1" #define MATROSKA_CODEC_ID_A_MPEG1_L2 "A_MPEG/L2" -- cgit v1.2.3