mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-01-11 09:59:50 +00:00
cbs_h2645: Avoid memcpy when splitting fragment
Now memcpy is avoided for NAL units that don't contain 0x03 escape characters. Improves performance of cbs_h2645_fragment_add_nals from 36940 decicycles to 6364 decicycles based on 8 runs with a 5.1 Mb/s H.264 sample (262144 runs each). Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@googlemail.com> Signed-off-by: Mark Thompson <sw@jkqxz.net>
This commit is contained in:
parent
97d1ee437b
commit
e895b800fe
@ -532,24 +532,30 @@ static int cbs_h2645_fragment_add_nals(CodedBitstreamContext *ctx,
|
||||
for (i = 0; i < packet->nb_nals; i++) {
|
||||
const H2645NAL *nal = &packet->nals[i];
|
||||
size_t size = nal->size;
|
||||
uint8_t *data;
|
||||
|
||||
// Remove trailing zeroes.
|
||||
while (size > 0 && nal->data[size - 1] == 0)
|
||||
--size;
|
||||
av_assert0(size > 0);
|
||||
|
||||
data = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
if (!data)
|
||||
return AVERROR(ENOMEM);
|
||||
memcpy(data, nal->data, size);
|
||||
memset(data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
if (nal->data == nal->raw_data) {
|
||||
err = ff_cbs_insert_unit_data(ctx, frag, -1, nal->type,
|
||||
(uint8_t*)nal->data, size, frag->data_ref);
|
||||
if (err < 0)
|
||||
return err;
|
||||
} else {
|
||||
uint8_t *data = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
if (!data)
|
||||
return AVERROR(ENOMEM);
|
||||
memcpy(data, nal->data, size);
|
||||
memset(data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
|
||||
|
||||
err = ff_cbs_insert_unit_data(ctx, frag, -1, nal->type,
|
||||
data, size, NULL);
|
||||
if (err < 0) {
|
||||
av_freep(&data);
|
||||
return err;
|
||||
err = ff_cbs_insert_unit_data(ctx, frag, -1, nal->type,
|
||||
data, size, NULL);
|
||||
if (err < 0) {
|
||||
av_freep(&data);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -86,6 +86,12 @@ int ff_h2645_extract_rbsp(const uint8_t *src, int length, H2645RBSP *rbsp,
|
||||
|
||||
/**
|
||||
* Split an input packet into NAL units.
|
||||
*
|
||||
* If data == raw_data holds true for a NAL unit of the returned pkt, then
|
||||
* said NAL unit does not contain any emulation_prevention_three_byte and
|
||||
* the data is contained in the input buffer pointed to by buf.
|
||||
* Otherwise, the unescaped data is part of the rbsp_buffer described by the
|
||||
* packet's H2645RBSP.
|
||||
*/
|
||||
int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
|
||||
void *logctx, int is_nalff, int nal_length_size,
|
||||
|
Loading…
Reference in New Issue
Block a user