Fixed MistInAV compiling in newMeta branches

This commit is contained in:
Thulinma 2020-08-28 13:31:13 +02:00
parent 73dc4fe7da
commit bc3ca638cd
2 changed files with 39 additions and 54 deletions

View file

@ -19,7 +19,7 @@ namespace Mist{
"redistributed, but it is a great tool for testing the other file-based inputs against."; "redistributed, but it is a great tool for testing the other file-based inputs against.";
capa["source_match"] = "/*"; capa["source_match"] = "/*";
capa["source_file"] = "$source"; capa["source_file"] = "$source";
capa["priority"] = 1ll; capa["priority"] = 1;
capa["codecs"][0u][0u].null(); capa["codecs"][0u][0u].null();
capa["codecs"][0u][1u].null(); capa["codecs"][0u][1u].null();
capa["codecs"][0u][2u].null(); capa["codecs"][0u][2u].null();
@ -88,52 +88,52 @@ namespace Mist{
} }
bool inputAV::readHeader(){ bool inputAV::readHeader(){
myMeta.tracks.clear();
for (unsigned int i = 0; i < pFormatCtx->nb_streams;){ for (unsigned int i = 0; i < pFormatCtx->nb_streams;){
AVStream *strm = pFormatCtx->streams[i++]; AVStream *strm = pFormatCtx->streams[i++];
myMeta.tracks[i].trackID = i; size_t idx = meta.addTrack();
meta.setID(idx, i);
switch (strm->codecpar->codec_id){ switch (strm->codecpar->codec_id){
case AV_CODEC_ID_HEVC: myMeta.tracks[i].codec = "HEVC"; break; case AV_CODEC_ID_HEVC: meta.setCodec(idx, "HEVC"); break;
case AV_CODEC_ID_MPEG1VIDEO: case AV_CODEC_ID_MPEG1VIDEO:
case AV_CODEC_ID_MPEG2VIDEO: myMeta.tracks[i].codec = "MPEG2"; break; case AV_CODEC_ID_MPEG2VIDEO: meta.setCodec(idx, "MPEG2"); break;
case AV_CODEC_ID_MP2: myMeta.tracks[i].codec = "MP2"; break; case AV_CODEC_ID_MP2: meta.setCodec(idx, "MP2"); break;
case AV_CODEC_ID_H264: myMeta.tracks[i].codec = "H264"; break; case AV_CODEC_ID_H264: meta.setCodec(idx, "H264"); break;
case AV_CODEC_ID_THEORA: myMeta.tracks[i].codec = "theora"; break; case AV_CODEC_ID_THEORA: meta.setCodec(idx, "theora"); break;
case AV_CODEC_ID_VORBIS: myMeta.tracks[i].codec = "vorbis"; break; case AV_CODEC_ID_VORBIS: meta.setCodec(idx, "vorbis"); break;
case AV_CODEC_ID_OPUS: myMeta.tracks[i].codec = "opus"; break; case AV_CODEC_ID_OPUS: meta.setCodec(idx, "opus"); break;
case AV_CODEC_ID_VP8: myMeta.tracks[i].codec = "VP8"; break; case AV_CODEC_ID_VP8: meta.setCodec(idx, "VP8"); break;
case AV_CODEC_ID_VP9: myMeta.tracks[i].codec = "VP9"; break; case AV_CODEC_ID_VP9: meta.setCodec(idx, "VP9"); break;
case AV_CODEC_ID_AAC: myMeta.tracks[i].codec = "AAC"; break; case AV_CODEC_ID_AAC: meta.setCodec(idx, "AAC"); break;
case AV_CODEC_ID_MP3: myMeta.tracks[i].codec = "MP3"; break; case AV_CODEC_ID_MP3: meta.setCodec(idx, "MP3"); break;
case AV_CODEC_ID_AC3: case AV_CODEC_ID_AC3:
case AV_CODEC_ID_EAC3: myMeta.tracks[i].codec = "AC3"; break; case AV_CODEC_ID_EAC3: meta.setCodec(idx, "AC3"); break;
default: default:
const AVCodecDescriptor *desc = avcodec_descriptor_get(strm->codecpar->codec_id); const AVCodecDescriptor *desc = avcodec_descriptor_get(strm->codecpar->codec_id);
if (desc && desc->name){ if (desc && desc->name){
myMeta.tracks[i].codec = desc->name; meta.setCodec(idx, desc->name);
}else{ }else{
myMeta.tracks[i].codec = "?"; meta.setCodec(idx, "?");
} }
break; break;
} }
if (strm->codecpar->extradata_size){ if (strm->codecpar->extradata_size){
myMeta.tracks[i].init = std::string((char *)strm->codecpar->extradata, strm->codecpar->extradata_size); meta.setInit(idx, std::string((char *)strm->codecpar->extradata, strm->codecpar->extradata_size));
} }
if (strm->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){ if (strm->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){
myMeta.tracks[i].type = "video"; meta.setType(idx, "video");
if (strm->avg_frame_rate.den && strm->avg_frame_rate.num){ if (strm->avg_frame_rate.den && strm->avg_frame_rate.num){
myMeta.tracks[i].fpks = (strm->avg_frame_rate.num * 1000) / strm->avg_frame_rate.den; meta.setFpks(idx, (strm->avg_frame_rate.num * 1000) / strm->avg_frame_rate.den);
}else{ }else{
myMeta.tracks[i].fpks = 0; meta.setFpks(idx, 0);
} }
myMeta.tracks[i].width = strm->codecpar->width; meta.setWidth(idx, strm->codecpar->width);
myMeta.tracks[i].height = strm->codecpar->height; meta.setHeight(idx, strm->codecpar->height);
} }
if (strm->codecpar->codec_type == AVMEDIA_TYPE_AUDIO){ if (strm->codecpar->codec_type == AVMEDIA_TYPE_AUDIO){
myMeta.tracks[i].type = "audio"; meta.setType(idx, "audio");
myMeta.tracks[i].rate = strm->codecpar->sample_rate; meta.setRate(idx, strm->codecpar->sample_rate);
myMeta.tracks[i].size = strm->codecpar->frame_size; meta.setSize(idx, strm->codecpar->frame_size);
myMeta.tracks[i].channels = strm->codecpar->channels; meta.setChannels(idx, strm->codecpar->channels);
} }
} }
@ -144,27 +144,27 @@ namespace Mist{
long long packOffset = 0; long long packOffset = 0;
bool isKey = false; bool isKey = false;
if (packTime < 0){packTime = 0;} if (packTime < 0){packTime = 0;}
if (packet.flags & AV_PKT_FLAG_KEY && myMeta.tracks[(long long)packet.stream_index + 1].type != "audio"){ size_t idx = meta.trackIDToIndex(packet.stream_index + 1);
if (packet.flags & AV_PKT_FLAG_KEY && M.getType(idx) != "audio"){
isKey = true; isKey = true;
} }
if (packet.pts != AV_NOPTS_VALUE && packet.pts != packet.dts){ if (packet.pts != AV_NOPTS_VALUE && packet.pts != packet.dts){
packOffset = ((packet.pts - packet.dts) * 1000 * strm->time_base.num / strm->time_base.den); packOffset = ((packet.pts - packet.dts) * 1000 * strm->time_base.num / strm->time_base.den);
} }
myMeta.update(packTime, packOffset, packet.stream_index + 1, packet.size, packet.pos, isKey); meta.update(packTime, packOffset, packet.stream_index + 1, packet.size, packet.pos, isKey);
av_packet_unref(&packet); av_packet_unref(&packet);
} }
myMeta.toFile(config->getString("input") + ".dtsh");
seek(0);
return true; return true;
} }
void inputAV::getNext(){ void inputAV::getNext(size_t wantIdx){
AVPacket packet; AVPacket packet;
while (av_read_frame(pFormatCtx, &packet) >= 0){ while (av_read_frame(pFormatCtx, &packet) >= 0){
// filter tracks we don't care about // filter tracks we don't care about
if (!selectedTracks.count(packet.stream_index + 1)){ size_t idx = meta.trackIDToIndex(packet.stream_index + 1);
if (idx == INVALID_TRACK_ID){continue;}
if (wantIdx != INVALID_TRACK_ID && idx != wantIdx){continue;}
if (!userSelect.count(idx)){
HIGH_MSG("Track %u not selected", packet.stream_index + 1); HIGH_MSG("Track %u not selected", packet.stream_index + 1);
continue; continue;
} }
@ -173,7 +173,7 @@ namespace Mist{
long long packOffset = 0; long long packOffset = 0;
bool isKey = false; bool isKey = false;
if (packTime < 0){packTime = 0;} if (packTime < 0){packTime = 0;}
if (packet.flags & AV_PKT_FLAG_KEY && myMeta.tracks[(long long)packet.stream_index + 1].type != "audio"){ if (packet.flags & AV_PKT_FLAG_KEY && M.getType(idx) != "audio"){
isKey = true; isKey = true;
} }
if (packet.pts != AV_NOPTS_VALUE && packet.pts != packet.dts){ if (packet.pts != AV_NOPTS_VALUE && packet.pts != packet.dts){
@ -190,7 +190,7 @@ namespace Mist{
FAIL_MSG("getNext failed"); FAIL_MSG("getNext failed");
} }
void inputAV::seek(int seekTime){ void inputAV::seek(uint64_t seekTime, size_t idx){
int stream_index = av_find_default_stream_index(pFormatCtx); int stream_index = av_find_default_stream_index(pFormatCtx);
// Convert ts to frame // Convert ts to frame
unsigned long long reseekTime = unsigned long long reseekTime =
@ -206,18 +206,4 @@ namespace Mist{
if (ret < 0){ret = av_seek_frame(pFormatCtx, stream_index, reseekTime, AVSEEK_FLAG_ANY);} if (ret < 0){ret = av_seek_frame(pFormatCtx, stream_index, reseekTime, AVSEEK_FLAG_ANY);}
} }
void inputAV::trackSelect(std::string trackSpec){
selectedTracks.clear();
long long unsigned int index;
while (trackSpec != ""){
index = trackSpec.find(' ');
selectedTracks.insert(atoi(trackSpec.substr(0, index).c_str()));
if (index != std::string::npos){
trackSpec.erase(0, index + 1);
}else{
trackSpec = "";
}
}
// inFile.selectTracks(selectedTracks);
}
}// namespace Mist }// namespace Mist

View file

@ -23,9 +23,8 @@ namespace Mist{
bool checkArguments(); bool checkArguments();
bool preRun(); bool preRun();
bool readHeader(); bool readHeader();
void getNext(); void getNext(size_t idx = INVALID_TRACK_ID);
void seek(int seekTime); void seek(uint64_t seekTime, size_t idx = INVALID_TRACK_ID);
void trackSelect(std::string trackSpec);
private: private:
AVFormatContext *pFormatCtx; AVFormatContext *pFormatCtx;