From 90419e15eb6ccbee54976e31238e440ea922f9ec Mon Sep 17 00:00:00 2001 From: Erik Zandvliet Date: Fri, 8 Apr 2016 11:06:51 +0200 Subject: [PATCH] Get width and height from sps when incorrect in mp4 file --- lib/flv_tag.cpp | 1 - src/input/input_mp4.cpp | 9 +++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/flv_tag.cpp b/lib/flv_tag.cpp index d4f5cf18..939a96c6 100644 --- a/lib/flv_tag.cpp +++ b/lib/flv_tag.cpp @@ -1110,7 +1110,6 @@ JSON::Value FLV::Tag::toJSON(DTSC::Meta & metadata, AMF::Object & amf_storage, u metadata.tracks[reTrack].width = spsChar.width; metadata.tracks[reTrack].height = spsChar.height; metadata.tracks[reTrack].fpks = spsChar.fps * 1000; - } pack_out.null(); return pack_out; //skip rest of parsing, get next tag. diff --git a/src/input/input_mp4.cpp b/src/input/input_mp4.cpp index 450dc44f..49f89bdf 100644 --- a/src/input/input_mp4.cpp +++ b/src/input/input_mp4.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include "input_mp4.h" @@ -387,6 +388,14 @@ namespace Mist { if (tmpContent.getType() == "avcC"){ myMeta.tracks[trackNo].init = std::string(tmpContent.payload(),tmpContent.payloadSize()); } + ///this is a hacky way around invalid FLV data (since it gets ignored nearly everywhere, but we do need correct data... + if (!myMeta.tracks[trackNo].width || !myMeta.tracks[trackNo].height || !myMeta.tracks[trackNo].fpks){ + h264::sequenceParameterSet sps; + sps.fromDTSCInit(myMeta.tracks[trackNo].init); + h264::SPSMeta spsChar = sps.getCharacteristics(); + myMeta.tracks[trackNo].width = spsChar.width; + myMeta.tracks[trackNo].height = spsChar.height; + } }else if (tmpType == "hev1" || tmpType == "hvc1"){ myMeta.tracks[trackNo].type = "video"; myMeta.tracks[trackNo].codec = "HEVC";