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 <mist/stream.h> #include <mist/flv_tag.h> #include <mist/defines.h> +#include <mist/h264.h> #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";