22 #include "isomediacontainer.hpp"
24 #include "io/memstream.hpp"
31 : RawContainer(file, 0)
32 , m_mp4io{ &IsoMediaContainer::read_callback, static_cast<void*>(file.get()) }
35 setEndian(ENDIAN_BIG);
36 m_file->seek(0, SEEK_SET);
37 auto status = mp4parse_new(&m_mp4io, &m_parser);
38 if (status != MP4PARSE_STATUS_OK) {
39 LOGERR(
"IsoM: failed to create parser: %d\n", status);
43 IsoMediaContainer::~IsoMediaContainer()
46 mp4parse_free(m_parser);
50 uint32_t IsoMediaContainer::count_tracks()
53 auto status = mp4parse_get_track_count(m_parser, &count);
54 if (status != MP4PARSE_STATUS_OK) {
55 LOGERR(
"IsoM: get_track_count() failed %d\n", status);
63 IsoMediaContainer::get_track(uint32_t index)
66 auto status = mp4parse_get_track_info(m_parser, index, &info);
67 if (status != MP4PARSE_STATUS_OK) {
74 IsoMediaContainer::get_raw_track(uint32_t index)
77 auto status = mp4parse_get_track_raw_info(m_parser, index, &info);
78 if (status != MP4PARSE_STATUS_OK) {
85 IsoMediaContainer::get_craw_header()
88 auto status = mp4parse_get_craw_header(m_parser, &header);
89 if (status != MP4PARSE_STATUS_OK) {
96 IsoMediaContainer::get_offsets_at(uint32_t index)
98 std::pair<uint64_t, uint64_t> entry;
99 auto status = mp4parse_get_craw_table_entry(m_parser, index,
100 &entry.first, &entry.second);
101 if (status != MP4PARSE_STATUS_OK) {
108 IsoMediaContainer::get_preview_desc()
110 auto preview_offset = get_offsets_at(1);
111 if (preview_offset) {
112 auto offset = (*preview_offset).first;
117 m_file->seek(offset, SEEK_SET);
118 auto width = readUInt16(m_file, m_endian);
119 auto height = readUInt16(m_file, m_endian);
121 auto jpeg_size = readUInt32(m_file, m_endian);
122 if (width && height && jpeg_size) {
125 offset + 10, *jpeg_size)));
131 std::shared_ptr<IfdFileContainer>
132 IsoMediaContainer::get_metadata_block(uint32_t idx)
134 if (m_meta_ifd.empty()) {
135 auto craw = get_craw_header();
137 return std::shared_ptr<IfdFileContainer>();
140 m_meta_ifd.resize(4);
141 if ((*craw).meta1.length) {
142 auto mem = std::make_shared<IO::MemStream>(
143 (*craw).meta1.data, (*craw).meta1.length);
144 m_meta_ifd[0] = std::make_shared<IfdFileContainer>(mem, 0);
146 m_meta_ifd[0] = std::shared_ptr<IfdFileContainer>();
148 if ((*craw).meta2.length) {
149 auto mem = std::make_shared<IO::MemStream>(
150 (*craw).meta2.data, (*craw).meta2.length);
151 m_meta_ifd[1] = std::make_shared<IfdFileContainer>(mem, 0);
153 m_meta_ifd[1] = std::shared_ptr<IfdFileContainer>();
155 if ((*craw).meta3.length) {
156 auto mem = std::make_shared<IO::MemStream>(
157 (*craw).meta3.data, (*craw).meta3.length);
158 m_meta_ifd[2] = std::make_shared<IfdFileContainer>(mem, 0);
160 m_meta_ifd[2] = std::shared_ptr<IfdFileContainer>();
162 if ((*craw).meta4.length) {
163 auto mem = std::make_shared<IO::MemStream>(
164 (*craw).meta4.data, (*craw).meta4.length);
165 m_meta_ifd[3] = std::make_shared<IfdFileContainer>(mem, 0);
167 m_meta_ifd[3] = std::shared_ptr<IfdFileContainer>();
170 if (idx < m_meta_ifd.size()) {
171 return m_meta_ifd.at(idx);
173 return std::shared_ptr<IfdFileContainer>();
177 IsoMediaContainer::read_callback(uint8_t* buf, uintptr_t len,
void*
self)
179 IO::Stream* stream =
static_cast<IO::Stream*
>(
self);
180 return stream->read(buf, len);
std::shared_ptr< Stream > Ptr
Tag class to help create an empty Option.
An option type inspired by Rust.
Option< T > option_some(T &&value)
Create an Option<T> is some value.
Global namespace for libopenraw.