From patchwork Wed Jan 23 23:01:12 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 11845 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 0899144EDC4 for ; Thu, 24 Jan 2019 01:01:25 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2FCC568AC87; Thu, 24 Jan 2019 01:01:13 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6DF2168AC78 for ; Thu, 24 Jan 2019 01:01:07 +0200 (EET) Received: by mail-wr1-f41.google.com with SMTP id z5so4403135wrt.11 for ; Wed, 23 Jan 2019 15:01:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jkqxz-net.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=lgz5y2HqfUWRSC85oiqKqgmtpwhAv3sSmYdXEQ3+2pw=; b=UpfDejOIn4GBYhVZtlMPWZrnvZxTEzt8vwj9kj/+/Ubpz1sAogqRtYH0UPK9+Qf9Vj 6RKHtywSMXKuFMRXn9ID/gcsn6nNW+VChdMRhZvxbMkR8/aGO2T834pGc50Ny0WT+zbC 81k39jF0nfMuDwGEE3AMfN6QNvij8jF5K85GJ/FHN8HR9LTPXXoTwHVaT+9TGDDlq4SN YkzzuXc+DXn7wGHAio86ppxOHGR2hFqNWZSDJE+V7kbNS3uWV8pEJ2raQj0eejaK+gGe 7uUTwVovfx79wr7sk+8Bacj9Cjs8WJ7rjWiDLiewOUxhrYmXtAy3iST/6OaFcNFzezkD DIUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=lgz5y2HqfUWRSC85oiqKqgmtpwhAv3sSmYdXEQ3+2pw=; b=t+kCGN+tqpYLjHzGBVjVnPhUXKF2TwhSAeAhvV6UcuENRMyGdCW0B8IgIapVBxFEMK LM14R8Jy3xqEBUpq2spAsP8hW2PaeFFgZRUwnzZeMWJOxBE3dOaa1NB9Gby4DDccehWG C9z3qfbqGTMpTa3N6TScPKOKWHf7Mig2WKqp1lekxhtTO5T4XkUdXIIBgpea9fkV1VVU iGZ/u6HjgmDESNB+HAKZ56CBsOCoXTgxzG2czq7/A0NcUGDTnJNSob2ckeDd95drmiKJ svxPxpyRoHuwP4nzE1q3YIwxd4ezmDjhpQIIp0cYsHeC+sCcv7X12zDE0HpgtcSsoxCX WU7g== X-Gm-Message-State: AJcUukcN2txDXusyJt6befB2Tw6NGWqRTa1/U33uGaytCR+LAMPkM0mo bRGbfwbYlXhhY50q0LQb0MEKQom7MvA= X-Google-Smtp-Source: ALg8bN4rgYCZemxqqXMr6q9vwMsMiuFvcedA05flwdE4RkZlwWMPW0PQYFIk6ENvJV+rd8En1eqbIQ== X-Received: by 2002:adf:8506:: with SMTP id 6mr4794018wrh.128.1548284484629; Wed, 23 Jan 2019 15:01:24 -0800 (PST) Received: from rywe.jkqxz.net (cpc91242-cmbg18-2-0-cust650.5-4.cable.virginm.net. [82.8.130.139]) by smtp.gmail.com with ESMTPSA id a62sm48786478wmf.47.2019.01.23.15.01.23 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 23 Jan 2019 15:01:24 -0800 (PST) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Wed, 23 Jan 2019 23:01:12 +0000 Message-Id: <20190123230114.1086-6-sw@jkqxz.net> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190123230114.1086-1-sw@jkqxz.net> References: <20190123230114.1086-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 5/7] cbs_h265: Use table-based alloc/free X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavcodec/cbs_h2645.c | 186 ++++++++++++++++++----------------------- 1 file changed, 83 insertions(+), 103 deletions(-) diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c index caf8a1062f..4fda12adb7 100644 --- a/libavcodec/cbs_h2645.c +++ b/libavcodec/cbs_h2645.c @@ -414,70 +414,6 @@ static int cbs_h2645_read_more_rbsp_data(GetBitContext *gbc) #undef allocate -static void cbs_h265_free_vps(void *unit, uint8_t *content) -{ - H265RawVPS *vps = (H265RawVPS*)content; - av_buffer_unref(&vps->extension_data.data_ref); - av_freep(&content); -} - -static void cbs_h265_free_sps(void *unit, uint8_t *content) -{ - H265RawSPS *sps = (H265RawSPS*)content; - av_buffer_unref(&sps->extension_data.data_ref); - av_freep(&content); -} - -static void cbs_h265_free_pps(void *unit, uint8_t *content) -{ - H265RawPPS *pps = (H265RawPPS*)content; - av_buffer_unref(&pps->extension_data.data_ref); - av_freep(&content); -} - -static void cbs_h265_free_slice(void *unit, uint8_t *content) -{ - H265RawSlice *slice = (H265RawSlice*)content; - av_buffer_unref(&slice->data_ref); - av_freep(&content); -} - -static void cbs_h265_free_sei_payload(H265RawSEIPayload *payload) -{ - switch (payload->payload_type) { - case HEVC_SEI_TYPE_BUFFERING_PERIOD: - case HEVC_SEI_TYPE_PICTURE_TIMING: - case HEVC_SEI_TYPE_PAN_SCAN_RECT: - case HEVC_SEI_TYPE_RECOVERY_POINT: - case HEVC_SEI_TYPE_DISPLAY_ORIENTATION: - case HEVC_SEI_TYPE_ACTIVE_PARAMETER_SETS: - case HEVC_SEI_TYPE_DECODED_PICTURE_HASH: - case HEVC_SEI_TYPE_TIME_CODE: - case HEVC_SEI_TYPE_MASTERING_DISPLAY_INFO: - case HEVC_SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO: - case HEVC_SEI_TYPE_ALTERNATIVE_TRANSFER_CHARACTERISTICS: - break; - case HEVC_SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35: - av_buffer_unref(&payload->payload.user_data_registered.data_ref); - break; - case HEVC_SEI_TYPE_USER_DATA_UNREGISTERED: - av_buffer_unref(&payload->payload.user_data_unregistered.data_ref); - break; - default: - av_buffer_unref(&payload->payload.other.data_ref); - break; - } -} - -static void cbs_h265_free_sei(void *unit, uint8_t *content) -{ - H265RawSEI *sei = (H265RawSEI*)content; - int i; - for (i = 0; i < sei->payload_count; i++) - cbs_h265_free_sei_payload(&sei->payload[i]); - av_freep(&content); -} - static int cbs_h2645_fragment_add_nals(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, const H2645Packet *packet) @@ -831,16 +767,14 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx, if (err < 0) return err; + err = ff_cbs_alloc_unit_content2(ctx, unit); + if (err < 0) + return err; + switch (unit->type) { case HEVC_NAL_VPS: { - H265RawVPS *vps; - - err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(*vps), - &cbs_h265_free_vps); - if (err < 0) - return err; - vps = unit->content; + H265RawVPS *vps = unit->content; err = cbs_h265_read_vps(ctx, &gbc, vps); if (err < 0) @@ -853,13 +787,7 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx, break; case HEVC_NAL_SPS: { - H265RawSPS *sps; - - err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(*sps), - &cbs_h265_free_sps); - if (err < 0) - return err; - sps = unit->content; + H265RawSPS *sps = unit->content; err = cbs_h265_read_sps(ctx, &gbc, sps); if (err < 0) @@ -873,13 +801,7 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx, case HEVC_NAL_PPS: { - H265RawPPS *pps; - - err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(*pps), - &cbs_h265_free_pps); - if (err < 0) - return err; - pps = unit->content; + H265RawPPS *pps = unit->content; err = cbs_h265_read_pps(ctx, &gbc, pps); if (err < 0) @@ -908,15 +830,9 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx, case HEVC_NAL_IDR_N_LP: case HEVC_NAL_CRA_NUT: { - H265RawSlice *slice; + H265RawSlice *slice = unit->content; int pos, len; - err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(*slice), - &cbs_h265_free_slice); - if (err < 0) - return err; - slice = unit->content; - err = cbs_h265_read_slice_segment_header(ctx, &gbc, &slice->header); if (err < 0) return err; @@ -942,11 +858,6 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx, case HEVC_NAL_AUD: { - err = ff_cbs_alloc_unit_content(ctx, unit, - sizeof(H265RawAUD), NULL); - if (err < 0) - return err; - err = cbs_h265_read_aud(ctx, &gbc, unit->content); if (err < 0) return err; @@ -956,12 +867,6 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx, case HEVC_NAL_SEI_PREFIX: case HEVC_NAL_SEI_SUFFIX: { - err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(H265RawSEI), - &cbs_h265_free_sei); - - if (err < 0) - return err; - err = cbs_h265_read_sei(ctx, &gbc, unit->content, unit->type == HEVC_NAL_SEI_PREFIX); @@ -1497,6 +1402,79 @@ static const CodedBitstreamUnitTypeDescriptor cbs_h264_unit_types[] = { CBS_UNIT_TYPE_END_OF_LIST }; +static void cbs_h265_free_sei_payload(H265RawSEIPayload *payload) +{ + switch (payload->payload_type) { + case HEVC_SEI_TYPE_BUFFERING_PERIOD: + case HEVC_SEI_TYPE_PICTURE_TIMING: + case HEVC_SEI_TYPE_PAN_SCAN_RECT: + case HEVC_SEI_TYPE_RECOVERY_POINT: + case HEVC_SEI_TYPE_DISPLAY_ORIENTATION: + case HEVC_SEI_TYPE_ACTIVE_PARAMETER_SETS: + case HEVC_SEI_TYPE_DECODED_PICTURE_HASH: + case HEVC_SEI_TYPE_TIME_CODE: + case HEVC_SEI_TYPE_MASTERING_DISPLAY_INFO: + case HEVC_SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO: + case HEVC_SEI_TYPE_ALTERNATIVE_TRANSFER_CHARACTERISTICS: + break; + case HEVC_SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35: + av_buffer_unref(&payload->payload.user_data_registered.data_ref); + break; + case HEVC_SEI_TYPE_USER_DATA_UNREGISTERED: + av_buffer_unref(&payload->payload.user_data_unregistered.data_ref); + break; + default: + av_buffer_unref(&payload->payload.other.data_ref); + break; + } +} + +static void cbs_h265_free_sei(void *unit, uint8_t *content) +{ + H265RawSEI *sei = (H265RawSEI*)content; + int i; + for (i = 0; i < sei->payload_count; i++) + cbs_h265_free_sei_payload(&sei->payload[i]); + av_freep(&content); +} + +#define CBS_UNIT_TYPE_H265_SLICE(nal) \ + CBS_UNIT_TYPE_INTERNAL_REFS(HEVC_NAL_ ## nal, H265RawSlice, \ + 1, { offsetof(H265RawSlice, data_ref) }) + +static const CodedBitstreamUnitTypeDescriptor cbs_h265_unit_types[] = { + CBS_UNIT_TYPE_INTERNAL_REFS(HEVC_NAL_VPS, H265RawVPS, + 1, { offsetof(H265RawVPS, extension_data.data_ref) }), + CBS_UNIT_TYPE_INTERNAL_REFS(HEVC_NAL_SPS, H265RawSPS, + 1, { offsetof(H265RawSPS, extension_data.data_ref) }), + CBS_UNIT_TYPE_INTERNAL_REFS(HEVC_NAL_PPS, H265RawPPS, + 1, { offsetof(H265RawPPS, extension_data.data_ref) }), + + CBS_UNIT_TYPE_H265_SLICE(TRAIL_N), + CBS_UNIT_TYPE_H265_SLICE(TRAIL_R), + CBS_UNIT_TYPE_H265_SLICE(TSA_N), + CBS_UNIT_TYPE_H265_SLICE(TSA_R), + CBS_UNIT_TYPE_H265_SLICE(STSA_N), + CBS_UNIT_TYPE_H265_SLICE(STSA_R), + CBS_UNIT_TYPE_H265_SLICE(RADL_N), + CBS_UNIT_TYPE_H265_SLICE(RADL_R), + CBS_UNIT_TYPE_H265_SLICE(RASL_N), + CBS_UNIT_TYPE_H265_SLICE(RASL_R), + CBS_UNIT_TYPE_H265_SLICE(BLA_W_LP), + CBS_UNIT_TYPE_H265_SLICE(BLA_W_RADL), + CBS_UNIT_TYPE_H265_SLICE(BLA_N_LP), + CBS_UNIT_TYPE_H265_SLICE(IDR_W_RADL), + CBS_UNIT_TYPE_H265_SLICE(IDR_N_LP), + CBS_UNIT_TYPE_H265_SLICE(CRA_NUT), + + CBS_UNIT_TYPE_POD(H264_NAL_AUD, H265RawAUD), + + CBS_UNIT_TYPE_COMPLEX(HEVC_NAL_SEI_PREFIX, H265RawSEI, &cbs_h265_free_sei), + CBS_UNIT_TYPE_COMPLEX(HEVC_NAL_SEI_SUFFIX, H265RawSEI, &cbs_h265_free_sei), + + CBS_UNIT_TYPE_END_OF_LIST +}; + const CodedBitstreamType ff_cbs_type_h264 = { .codec_id = AV_CODEC_ID_H264, @@ -1517,6 +1495,8 @@ const CodedBitstreamType ff_cbs_type_h265 = { .priv_data_size = sizeof(CodedBitstreamH265Context), + .unit_types = cbs_h265_unit_types, + .split_fragment = &cbs_h2645_split_fragment, .read_unit = &cbs_h265_read_nal_unit, .write_unit = &cbs_h2645_write_nal_unit,