From: Petri H. <phi...@us...> - 2013-10-29 10:46:19
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1383043503 -7200 # Node ID b58b503d09f4d6268ba2c102adfa6a53ccf1ece0 # Branch default # Parent 04844e131db365deac4eb7ecdb9a61502aad07cd Demux VP9 and HEVC from matroska diff --git a/src/demuxers/demux_matroska.c b/src/demuxers/demux_matroska.c --- a/src/demuxers/demux_matroska.c +++ b/src/demuxers/demux_matroska.c @@ -1092,6 +1092,28 @@ 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 @@ 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)) { --git a/src/demuxers/matroska.h b/src/demuxers/matroska.h --- a/src/demuxers/matroska.h +++ b/src/demuxers/matroska.h @@ -315,6 +315,8 @@ #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" |