webm2pes: Add a WebM parser init method.
Pre-refactor a little to avoid some code duplication. Change-Id: I8ce733be0c9e07544fc25bd9890d68fb14a7e84d
This commit is contained in:
105
webm2pes.cc
105
webm2pes.cc
@@ -249,12 +249,6 @@ bool Webm2Pes::ConvertToFile() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (webm_reader_.Open(input_file_name_.c_str()) != 0) {
|
|
||||||
std::fprintf(stderr, "Webm2Pes: Cannot open %s as input.\n",
|
|
||||||
input_file_name_.c_str());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
output_file_ = FilePtr(fopen(output_file_name_.c_str(), "wb"), FILEDeleter());
|
output_file_ = FilePtr(fopen(output_file_name_.c_str(), "wb"), FILEDeleter());
|
||||||
if (output_file_ == nullptr) {
|
if (output_file_ == nullptr) {
|
||||||
std::fprintf(stderr, "Webm2Pes: Cannot open %s for output.\n",
|
std::fprintf(stderr, "Webm2Pes: Cannot open %s for output.\n",
|
||||||
@@ -262,6 +256,62 @@ bool Webm2Pes::ConvertToFile() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (InitWebmParser() != true) {
|
||||||
|
std::fprintf(stderr, "Webm2Pes: Cannot initialize WebM parser.\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Walk clusters in segment.
|
||||||
|
const mkvparser::Cluster* cluster = webm_parser_->GetFirst();
|
||||||
|
while (cluster != nullptr && cluster->EOS() == false) {
|
||||||
|
const mkvparser::BlockEntry* block_entry = nullptr;
|
||||||
|
std::int64_t block_status = cluster->GetFirst(block_entry);
|
||||||
|
if (block_status < 0) {
|
||||||
|
std::fprintf(stderr, "Webm2Pes: Cannot parse first block in %s.\n",
|
||||||
|
input_file_name_.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Walk blocks in cluster.
|
||||||
|
while (block_entry != nullptr && block_entry->EOS() == false) {
|
||||||
|
const mkvparser::Block* block = block_entry->GetBlock();
|
||||||
|
if (block->GetTrackNumber() == video_track_num_) {
|
||||||
|
const int frame_count = block->GetFrameCount();
|
||||||
|
|
||||||
|
// Walk frames in block.
|
||||||
|
for (int frame_num = 0; frame_num < frame_count; ++frame_num) {
|
||||||
|
const mkvparser::Block::Frame& frame = block->GetFrame(frame_num);
|
||||||
|
|
||||||
|
// Write frame out as PES packet(s).
|
||||||
|
const bool pes_status =
|
||||||
|
WritePesPacket(frame, block->GetTime(cluster));
|
||||||
|
if (pes_status != true) {
|
||||||
|
std::fprintf(stderr, "Webm2Pes: WritePesPacket failed.\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
block_status = cluster->GetNext(block_entry, block_entry);
|
||||||
|
if (block_status < 0) {
|
||||||
|
std::fprintf(stderr, "Webm2Pes: Cannot parse block in %s.\n",
|
||||||
|
input_file_name_.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cluster = webm_parser_->GetNext(cluster);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Webm2Pes::InitWebmParser() {
|
||||||
|
if (webm_reader_.Open(input_file_name_.c_str()) != 0) {
|
||||||
|
std::fprintf(stderr, "Webm2Pes: Cannot open %s as input.\n",
|
||||||
|
input_file_name_.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
using mkvparser::Segment;
|
using mkvparser::Segment;
|
||||||
Segment* webm_parser = nullptr;
|
Segment* webm_parser = nullptr;
|
||||||
if (Segment::CreateInstance(&webm_reader_, 0 /* pos */,
|
if (Segment::CreateInstance(&webm_reader_, 0 /* pos */,
|
||||||
@@ -308,48 +358,6 @@ bool Webm2Pes::ConvertToFile() {
|
|||||||
input_file_name_.c_str());
|
input_file_name_.c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Walk clusters in segment.
|
|
||||||
const mkvparser::Cluster* cluster = webm_parser_->GetFirst();
|
|
||||||
while (cluster != nullptr && cluster->EOS() == false) {
|
|
||||||
const mkvparser::BlockEntry* block_entry = nullptr;
|
|
||||||
std::int64_t block_status = cluster->GetFirst(block_entry);
|
|
||||||
if (block_status < 0) {
|
|
||||||
std::fprintf(stderr, "Webm2Pes: Cannot parse first block in %s.\n",
|
|
||||||
input_file_name_.c_str());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Walk blocks in cluster.
|
|
||||||
while (block_entry != nullptr && block_entry->EOS() == false) {
|
|
||||||
const mkvparser::Block* block = block_entry->GetBlock();
|
|
||||||
if (block->GetTrackNumber() == video_track_num_) {
|
|
||||||
const int frame_count = block->GetFrameCount();
|
|
||||||
|
|
||||||
// Walk frames in block.
|
|
||||||
for (int frame_num = 0; frame_num < frame_count; ++frame_num) {
|
|
||||||
const mkvparser::Block::Frame& frame = block->GetFrame(frame_num);
|
|
||||||
|
|
||||||
// Write frame out as PES packet(s).
|
|
||||||
const bool pes_status =
|
|
||||||
WritePesPacket(frame, block->GetTime(cluster));
|
|
||||||
if (pes_status != true) {
|
|
||||||
std::fprintf(stderr, "Webm2Pes: WritePesPacket failed.\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
block_status = cluster->GetNext(block_entry, block_entry);
|
|
||||||
if (block_status < 0) {
|
|
||||||
std::fprintf(stderr, "Webm2Pes: Cannot parse block in %s.\n",
|
|
||||||
input_file_name_.c_str());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cluster = webm_parser_->GetNext(cluster);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -430,4 +438,3 @@ bool Webm2Pes::WritePesPacket(const mkvparser::Block::Frame& vpx_frame,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} // namespace libwebm
|
} // namespace libwebm
|
||||||
|
|
||||||
|
|||||||
@@ -184,6 +184,7 @@ class Webm2Pes {
|
|||||||
};
|
};
|
||||||
typedef std::unique_ptr<FILE, FILEDeleter> FilePtr;
|
typedef std::unique_ptr<FILE, FILEDeleter> FilePtr;
|
||||||
|
|
||||||
|
bool InitWebmParser();
|
||||||
bool WritePesPacket(const mkvparser::Block::Frame& vpx_frame,
|
bool WritePesPacket(const mkvparser::Block::Frame& vpx_frame,
|
||||||
double nanosecond_pts);
|
double nanosecond_pts);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user