From f6a43a889425636cb6262a17267959d936fdad90 Mon Sep 17 00:00:00 2001 From: ronag Date: Fri, 19 Aug 2011 10:31:20 +0000 Subject: [PATCH] 2.0. ffmpeg_producer: Fixed FLV meta-data reading. git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1226 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- modules/ffmpeg/producer/format/flv.cpp | 64 +++++++++++++++++--------- 1 file changed, 43 insertions(+), 21 deletions(-) diff --git a/modules/ffmpeg/producer/format/flv.cpp b/modules/ffmpeg/producer/format/flv.cpp index e1574f5f3..0e87dcbea 100644 --- a/modules/ffmpeg/producer/format/flv.cpp +++ b/modules/ffmpeg/producer/format/flv.cpp @@ -15,12 +15,26 @@ namespace caspar { double next_double(std::fstream& fileStream) { std::vector bytes(8); - fileStream.read(bytes.data(), bytes.size()); + + auto tmp2 = fileStream.tellg(); + tmp2; + + fileStream.read(bytes.data(), 8); + + auto tmp3 = fileStream.gcount(); + tmp3; + + tmp2 = fileStream.tellg(); + tmp2; + fileStream.seekg(1, std::ios::cur); + + tmp2 = fileStream.tellg(); + tmp2; std::reverse(bytes.begin(), bytes.end()); double* tmp = (double*)bytes.data(); - + return *tmp; } @@ -45,38 +59,46 @@ std::map read_flv_meta_info(const std::string& filenam BOOST_THROW_EXCEPTION(caspar_exception()); std::fstream fileStream = std::fstream(filename, std::fstream::in); - fileStream.seekg(27, std::ios::beg); - - std::vector bytes(10); - fileStream.read(bytes.data(), bytes.size()); - - if(std::string(bytes.begin(), bytes.end()) == "onMetaData") + + std::vector bytes2(256); + fileStream.read(bytes2.data(), bytes2.size()); + + auto ptr = bytes2.data(); + + ptr += 27; + + if(std::string(ptr, ptr+10) == "onMetaData") { - fileStream.seekg(6, std::ios::cur); + ptr += 16; for(int n = 0; n < 16; ++n) { - char name_size = 0; - fileStream.read(&name_size, 1); + char name_size = *ptr++; if(name_size == 0) break; - std::vector name(name_size); - fileStream.read(name.data(), name.size()); - auto name_str = std::string(name.begin(), name.end()); - - char data_type = 0; - fileStream.read(&data_type, 1); + auto name = std::string(ptr, ptr + name_size); + ptr += name_size; + char data_type = *ptr++; switch(data_type) { case 0: - values[name_str] = boost::lexical_cast(next_double(fileStream)); - break; + { + std::reverse(ptr, ptr+8); + values[name] = boost::lexical_cast(*(double*)(ptr)); + ptr += 9; + + break; + } case 1: - values[name_str] = boost::lexical_cast(next_bool(fileStream)); - break; + { + values[name] = boost::lexical_cast(*ptr != 0); + ptr += 2; + + break; + } } } } -- 2.39.2