From d0ba6aee86a77c15831497f97987d94f09227eda Mon Sep 17 00:00:00 2001 From: ronag Date: Thu, 18 Aug 2011 11:17:06 +0000 Subject: [PATCH] git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1213 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- modules/ffmpeg/producer/format/flv.cpp | 70 ++++++++++++++++++++++++++ modules/ffmpeg/producer/format/flv.h | 26 ++++++++++ 2 files changed, 96 insertions(+) create mode 100644 modules/ffmpeg/producer/format/flv.cpp create mode 100644 modules/ffmpeg/producer/format/flv.h diff --git a/modules/ffmpeg/producer/format/flv.cpp b/modules/ffmpeg/producer/format/flv.cpp new file mode 100644 index 000000000..3ebcc8ec0 --- /dev/null +++ b/modules/ffmpeg/producer/format/flv.cpp @@ -0,0 +1,70 @@ +#include "../../stdafx.h" + +#include "flv.h" + +#include + +#include + +#include + +namespace caspar { + +double to_double(std::vector bytes, bool readInReverse) +{ + if(bytes.size() != 8) + BOOST_THROW_EXCEPTION(caspar_exception()); + + if (readInReverse) + std::reverse(bytes.begin(), bytes.end()); + + static_assert(sizeof(double) == 8, ""); + + double* tmp = (double*)bytes.data(); + + double val = *tmp; + return val; +} + +double next_double(std::fstream& fileStream, int offset, int length) +{ + fileStream.seekg(offset, std::ios::cur); + std::vector bytes(length); + fileStream.read(bytes.data(), length); + return to_double(bytes, true); +} + +flv_meta_info read_flv_meta_info(const std::wstring& filename) +{ + if(!boost::filesystem::exists(filename)) + BOOST_THROW_EXCEPTION(caspar_exception()); + + flv_meta_info meta_info; + + std::fstream fileStream = std::fstream(narrow(filename), std::fstream::in); + fileStream.seekg(27, std::ios::beg); + + std::array bytes; + fileStream.read(bytes.data(), bytes.size()); + + auto on_meta_data = std::string(bytes.begin(), bytes.end()); + if (on_meta_data == "onMetaData") + { + //// 16 bytes past "onMetaData" is the data for "duration" + meta_info.duration = next_double(fileStream, 16, 8); + //// 8 bytes past "duration" is the data for "width" + meta_info.width = next_double(fileStream, 8, 8); + //// 9 bytes past "width" is the data for "height" + meta_info.height = next_double(fileStream, 9, 8); + //// 16 bytes past "height" is the data for "videoDataRate" + meta_info.video_data_rate = next_double(fileStream, 16, 8); + //// 16 bytes past "videoDataRate" is the data for "audioDataRate" + meta_info.audio_data_rate = next_double(fileStream, 16, 8); + //// 12 bytes past "audioDataRate" is the data for "frameRate" + meta_info.frame_rate = next_double(fileStream, 12, 8); + } + + return meta_info; +} + +} \ No newline at end of file diff --git a/modules/ffmpeg/producer/format/flv.h b/modules/ffmpeg/producer/format/flv.h new file mode 100644 index 000000000..8ec2265c4 --- /dev/null +++ b/modules/ffmpeg/producer/format/flv.h @@ -0,0 +1,26 @@ +#pragma once + +namespace caspar { + +struct flv_meta_info +{ + double duration; + double width; + double height; + double frame_rate; + double video_data_rate; + double audio_data_rate; + + flv_meta_info() + : duration(0.0) + , width(0.0) + , height(0.0) + , frame_rate(0.0) + , video_data_rate(0.0) + , audio_data_rate(0.0) + {} +}; + +flv_meta_info read_flv_meta_info(const std::wstring& filename); + +} \ No newline at end of file -- 2.39.2