mirror of
https://gitlab.com/mbunkus/mkvtoolnix.git
synced 2024-12-24 11:54:01 +00:00
Added support in mkvextract for the new SimpleBlock.
This commit is contained in:
parent
181e409c9b
commit
a0cfe383b5
@ -1,5 +1,7 @@
|
|||||||
2005-10-21 Moritz Bunkus <moritz@bunkus.org>
|
2005-10-21 Moritz Bunkus <moritz@bunkus.org>
|
||||||
|
|
||||||
|
* mkvextract: new feature: Added support for the new SimpleBlock.
|
||||||
|
|
||||||
* mkvmerge, mmg: new feature: Added support for the new
|
* mkvmerge, mmg: new feature: Added support for the new
|
||||||
SimpleBlock instead of BlockGroups (only available via "--engage
|
SimpleBlock instead of BlockGroups (only available via "--engage
|
||||||
use_simpleblock" for now). Patch by Steve Lhomme (see AUTHORS)
|
use_simpleblock" for now). Patch by Steve Lhomme (see AUTHORS)
|
||||||
|
@ -158,8 +158,9 @@ handle_blockgroup(KaxBlockGroup &blockgroup,
|
|||||||
|
|
||||||
// Only continue if this block group actually contains a block.
|
// Only continue if this block group actually contains a block.
|
||||||
block = FINDFIRST(&blockgroup, KaxBlock);
|
block = FINDFIRST(&blockgroup, KaxBlock);
|
||||||
if (NULL == block)
|
if ((NULL == block) || (0 == block->NumberFrames()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
block->SetParent(cluster);
|
block->SetParent(cluster);
|
||||||
|
|
||||||
// Do we need this block group?
|
// Do we need this block group?
|
||||||
@ -194,9 +195,71 @@ handle_blockgroup(KaxBlockGroup &blockgroup,
|
|||||||
// Any block additions present?
|
// Any block additions present?
|
||||||
kadditions = FINDFIRST(&blockgroup, KaxBlockAdditions);
|
kadditions = FINDFIRST(&blockgroup, KaxBlockAdditions);
|
||||||
|
|
||||||
// Pass the block to the extractor.
|
if (0 > duration)
|
||||||
extractor->handle_block_v1(*block, kadditions, block->GlobalTimecode(),
|
duration = extractor->default_duration * block->NumberFrames();
|
||||||
duration, bref, fref);
|
|
||||||
|
for (i = 0; i < block->NumberFrames(); i++) {
|
||||||
|
int64_t this_timecode, this_duration;
|
||||||
|
|
||||||
|
if (0 > duration) {
|
||||||
|
this_timecode = block->GlobalTimecode();
|
||||||
|
this_duration = duration;
|
||||||
|
} else {
|
||||||
|
this_timecode = block->GlobalTimecode() + i * duration /
|
||||||
|
block->NumberFrames();
|
||||||
|
this_duration = duration / block->NumberFrames();
|
||||||
|
}
|
||||||
|
|
||||||
|
DataBuffer &data = block->GetBuffer(i);
|
||||||
|
memory_cptr frame(new memory_c(data.Buffer(), data.Size(), false));
|
||||||
|
extractor->handle_frame(frame, kadditions, this_timecode, this_duration,
|
||||||
|
bref, fref, false, false, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_simpleblock(KaxSimpleBlock &simpleblock,
|
||||||
|
KaxCluster &cluster) {
|
||||||
|
xtr_base_c *extractor;
|
||||||
|
int64_t duration;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
if (0 == simpleblock.NumberFrames())
|
||||||
|
return;
|
||||||
|
|
||||||
|
simpleblock.SetParent(cluster);
|
||||||
|
|
||||||
|
// Do we need this block group?
|
||||||
|
extractor = NULL;
|
||||||
|
for (i = 0; i < extractors.size(); i++)
|
||||||
|
if (simpleblock.TrackNum() == extractors[i]->tid) {
|
||||||
|
extractor = extractors[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL == extractor)
|
||||||
|
return;
|
||||||
|
|
||||||
|
duration = extractor->default_duration * simpleblock.NumberFrames();
|
||||||
|
|
||||||
|
for (i = 0; i < simpleblock.NumberFrames(); i++) {
|
||||||
|
int64_t this_timecode, this_duration;
|
||||||
|
|
||||||
|
if (0 > duration) {
|
||||||
|
this_timecode = simpleblock.GlobalTimecode();
|
||||||
|
this_duration = duration;
|
||||||
|
} else {
|
||||||
|
this_timecode = simpleblock.GlobalTimecode() + i * duration /
|
||||||
|
simpleblock.NumberFrames();
|
||||||
|
this_duration = duration / simpleblock.NumberFrames();
|
||||||
|
}
|
||||||
|
|
||||||
|
DataBuffer &data = simpleblock.GetBuffer(i);
|
||||||
|
memory_cptr frame(new memory_c(data.Buffer(), data.Size(), false));
|
||||||
|
extractor->handle_frame(frame, NULL, this_timecode, this_duration,
|
||||||
|
-1, -1, simpleblock.IsKeyframe(),
|
||||||
|
simpleblock.IsDiscardable(), false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -427,6 +490,13 @@ extract_tracks(const char *file_name,
|
|||||||
handle_blockgroup(*static_cast<KaxBlockGroup *>(l2), *cluster,
|
handle_blockgroup(*static_cast<KaxBlockGroup *>(l2), *cluster,
|
||||||
tc_scale);
|
tc_scale);
|
||||||
|
|
||||||
|
} else if (EbmlId(*l2) == KaxSimpleBlock::ClassInfos.GlobalId) {
|
||||||
|
show_element(l2, 2, _("SimpleBlock"));
|
||||||
|
|
||||||
|
l2->Read(*es, KaxSimpleBlock::ClassInfos.Context, upper_lvl_el, l3,
|
||||||
|
true);
|
||||||
|
handle_simpleblock(*static_cast<KaxSimpleBlock *>(l2), *cluster);
|
||||||
|
|
||||||
} else
|
} else
|
||||||
l2->SkipData(*es, l2->Generic().Context);
|
l2->SkipData(*es, l2->Generic().Context);
|
||||||
|
|
||||||
|
@ -68,39 +68,6 @@ xtr_base_c::create_file(xtr_base_c *_master,
|
|||||||
default_duration = kt_get_default_duration(track);
|
default_duration = kt_get_default_duration(track);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
xtr_base_c::handle_block_v1(KaxBlock &block,
|
|
||||||
KaxBlockAdditions *additions,
|
|
||||||
int64_t timecode,
|
|
||||||
int64_t duration,
|
|
||||||
int64_t bref,
|
|
||||||
int64_t fref) {
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (0 == block.NumberFrames())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (0 > duration)
|
|
||||||
duration = default_duration * block.NumberFrames();
|
|
||||||
|
|
||||||
for (i = 0; i < block.NumberFrames(); i++) {
|
|
||||||
int64_t this_timecode, this_duration;
|
|
||||||
|
|
||||||
if (0 > duration) {
|
|
||||||
this_timecode = timecode;
|
|
||||||
this_duration = duration;
|
|
||||||
} else {
|
|
||||||
this_timecode = timecode + i * duration / block.NumberFrames();
|
|
||||||
this_duration = duration / block.NumberFrames();
|
|
||||||
}
|
|
||||||
|
|
||||||
DataBuffer &data = block.GetBuffer(i);
|
|
||||||
memory_cptr frame(new memory_c(data.Buffer(), data.Size(), false));
|
|
||||||
handle_frame(frame, additions, this_timecode, this_duration, bref, fref,
|
|
||||||
false, false, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
xtr_base_c::handle_frame(memory_cptr &frame,
|
xtr_base_c::handle_frame(memory_cptr &frame,
|
||||||
KaxBlockAdditions *additions,
|
KaxBlockAdditions *additions,
|
||||||
|
@ -45,9 +45,6 @@ public:
|
|||||||
virtual ~xtr_base_c();
|
virtual ~xtr_base_c();
|
||||||
|
|
||||||
virtual void create_file(xtr_base_c *_master, KaxTrackEntry &track);
|
virtual void create_file(xtr_base_c *_master, KaxTrackEntry &track);
|
||||||
virtual void handle_block_v1(KaxBlock &block, KaxBlockAdditions *additions,
|
|
||||||
int64_t timecode, int64_t duration, int64_t bref,
|
|
||||||
int64_t fref);
|
|
||||||
virtual void handle_frame(memory_cptr &frame, KaxBlockAdditions *additions,
|
virtual void handle_frame(memory_cptr &frame, KaxBlockAdditions *additions,
|
||||||
int64_t timecode, int64_t duration, int64_t bref,
|
int64_t timecode, int64_t duration, int64_t bref,
|
||||||
int64_t fref, bool keyframe, bool discardable,
|
int64_t fref, bool keyframe, bool discardable,
|
||||||
|
Loading…
Reference in New Issue
Block a user