summaryrefslogtreecommitdiff
path: root/libavcodec/cbs_h2645.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@googlemail.com>2018-11-21 19:34:29 +0100
committerMark Thompson <sw@jkqxz.net>2018-11-22 23:19:17 +0000
commite895b800fe273d3445be52a4880ae0172c193bc0 (patch)
tree0b758eccaeaa2c20508a1c7e05ccd0db38dace97 /libavcodec/cbs_h2645.c
parent97d1ee437bbf67d7e3897bc73df4f7d9771ac309 (diff)
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>
Diffstat (limited to 'libavcodec/cbs_h2645.c')
-rw-r--r--libavcodec/cbs_h2645.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c
index a2d0170e97..666970ed03 100644
--- a/libavcodec/cbs_h2645.c
+++ b/libavcodec/cbs_h2645.c
@@ -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;
+ }
}
}