From patchwork Thu Feb 4 19:09:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 25400 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 91743448077 for ; Thu, 4 Feb 2021 21:10:56 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7B96D68A370; Thu, 4 Feb 2021 21:10:56 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f182.google.com (mail-qk1-f182.google.com [209.85.222.182]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5FA9568A329 for ; Thu, 4 Feb 2021 21:10:55 +0200 (EET) Received: by mail-qk1-f182.google.com with SMTP id x81so4489819qkb.0 for ; Thu, 04 Feb 2021 11:10:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=a/wz1id2mH8tBNGqHl6wQgCGwH60R6lvPsmm+wvMPgo=; b=bF7VkVk69WmBQO7pyQ0eKbskglCclVWudSW3zo5EfJDK141FMqBG5cAK65YQkYUStQ 5feholcdQga6uZHEMSVQPSGekConx794LlqWG1Wcit2JqWW2+vOGdtwqeUtdf4KegWoJ 82o5ezVupD21XYmJTc53smnslOe19q85WTpUhYiRl8g5YzYRBibtrnBQE04PnkmXipGD 2fIVzefgqlTENaE1etZAS+FFkgojujI4r8AiT+tMYOjd2d68DzZPUB9hlIKEepJCvmiK dFzVv7XOooKOhrwvYkiL+j/EjI0aM10yElaX1elw7JTN51X0jKLNApcAZsUkEFakbGFz EYpw== 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=a/wz1id2mH8tBNGqHl6wQgCGwH60R6lvPsmm+wvMPgo=; b=gFxdAVWJdRVAVvGn6b9uPrdc90+X9DzcxCOu1TRniKjlgmTVwigLWYFiCoarTFSwdm 9QHwGK8elZhNGo4fSyv4ejxpgGrI5r1rWuQFGvDcIq31PtxXcCZWe/xd1ehgIYzX82Bn 2AcH4++GkE7gGZ818mXLyyxBhdscgen95U0Q8j1SAT3Iv5CK9o6j3t3xyZK307hnroc9 72VYedh8J/DDzTBrax8whB0EvzFj/mjFHGDRi4FrS2WHWO6/qydNCJKyHNngxvzZJYK5 /oRYxuvt+Zs5AvzIKre+hC/6i4JshWB3vRWJHGwtX5gzrPu/FRdul2CUDqEWxHk4nvAq 2OMw== X-Gm-Message-State: AOAM532BunMT2FpHA10voTlOciwReIDe8CRIzVQ8zM+uZJyjilkNGOGw 9ZOjBuBI4XrQlPBAY0vNIGZo1rrpaXk= X-Google-Smtp-Source: ABdhPJwElYZhlugjOK5v0360GxXHa2hynRZsue4NqjrpwLuC3ycue2+e0IEitR1aI8wK+J5HWtUsuQ== X-Received: by 2002:a37:7b02:: with SMTP id w2mr616979qkc.291.1612465853736; Thu, 04 Feb 2021 11:10:53 -0800 (PST) Received: from localhost.localdomain ([181.23.64.183]) by smtp.gmail.com with ESMTPSA id t14sm5889291qkt.50.2021.02.04.11.10.52 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Feb 2021 11:10:53 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 4 Feb 2021 16:09:28 -0300 Message-Id: <20210204191005.48190-14-jamrial@gmail.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210204191005.48190-1-jamrial@gmail.com> References: <20210204191005.48190-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 13/50] avformat/asfdec_o: use av_packet_alloc() to allocate packets 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" Signed-off-by: James Almer --- libavformat/asfdec_o.c | 63 ++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/libavformat/asfdec_o.c b/libavformat/asfdec_o.c index c1d90360b4..34ae541934 100644 --- a/libavformat/asfdec_o.c +++ b/libavformat/asfdec_o.c @@ -63,7 +63,7 @@ typedef struct GUIDParseTable { } GUIDParseTable; typedef struct ASFPacket { - AVPacket avpkt; + AVPacket *avpkt; int64_t dts; uint32_t frame_num; // ASF payloads with the same number are parts of the same frame int flags; @@ -781,8 +781,10 @@ static int asf_read_stream_properties(AVFormatContext *s, const GUIDParseTable * asf_st->index = st->index; asf_st->indexed = 0; st->id = flags & ASF_STREAM_NUM; - av_init_packet(&asf_st->pkt.avpkt); asf_st->pkt.data_size = 0; + asf_st->pkt.avpkt = av_packet_alloc(); + if (!asf_st->pkt.avpkt) + return AVERROR(ENOMEM); avio_skip(pb, 4); // skip reserved field switch (type) { @@ -1140,7 +1142,7 @@ static void reset_packet(ASFPacket *asf_pkt) asf_pkt->duration = 0; asf_pkt->flags = 0; asf_pkt->dts = 0; - av_packet_unref(&asf_pkt->avpkt); + av_packet_unref(asf_pkt->avpkt); } static int asf_read_replicated_data(AVFormatContext *s, ASFPacket *asf_pkt) @@ -1153,7 +1155,7 @@ static int asf_read_replicated_data(AVFormatContext *s, ASFPacket *asf_pkt) data_size = avio_rl32(pb); // read media object size if (data_size <= 0) return AVERROR_INVALIDDATA; - if ((ret = av_new_packet(&asf_pkt->avpkt, data_size)) < 0) + if ((ret = av_new_packet(asf_pkt->avpkt, data_size)) < 0) return ret; asf_pkt->data_size = asf_pkt->size_left = data_size; } else @@ -1194,7 +1196,7 @@ static int asf_read_multiple_payload(AVFormatContext *s, AVPacket *pkt, pay_len, asf->packet_size, avio_tell(pb)); return AVERROR_INVALIDDATA; } - p = asf_pkt->avpkt.data + asf_pkt->data_size - asf_pkt->size_left; + p = asf_pkt->avpkt->data + asf_pkt->data_size - asf_pkt->size_left; if (pay_len > asf_pkt->size_left) { av_log(s, AV_LOG_ERROR, "Error: invalid buffer size, pay_len %d, data size left %d.\n", @@ -1229,7 +1231,7 @@ static int asf_read_single_payload(AVFormatContext *s, ASFPacket *asf_pkt) data_size = avio_rl32(pb); // read media object size if (data_size <= 0) return AVERROR_EOF; - if ((ret = av_new_packet(&asf_pkt->avpkt, data_size)) < 0) + if ((ret = av_new_packet(asf_pkt->avpkt, data_size)) < 0) return ret; asf_pkt->data_size = asf_pkt->size_left = data_size; } else @@ -1250,7 +1252,7 @@ static int asf_read_single_payload(AVFormatContext *s, ASFPacket *asf_pkt) avio_tell(pb)); return AVERROR_INVALIDDATA; } - p = asf_pkt->avpkt.data + asf_pkt->data_size - asf_pkt->size_left; + p = asf_pkt->avpkt->data + asf_pkt->data_size - asf_pkt->size_left; if (size > asf_pkt->size_left || asf_pkt->size_left <= 0) return AVERROR_INVALIDDATA; if (asf_pkt->size_left > size) @@ -1387,16 +1389,18 @@ static int asf_deinterleave(AVFormatContext *s, ASFPacket *asf_pkt, int st_num) { ASFContext *asf = s->priv_data; ASFStream *asf_st = asf->asf_st[st_num]; - unsigned char *p = asf_pkt->avpkt.data; + unsigned char *p = asf_pkt->avpkt->data; uint16_t pkt_len = asf->asf_st[st_num]->virtual_pkt_len; uint16_t chunk_len = asf->asf_st[st_num]->virtual_chunk_len; int nchunks = pkt_len / chunk_len; - AVPacket pkt; + uint8_t *data; int pos = 0, j, l, ret; - if ((ret = av_new_packet(&pkt, asf_pkt->data_size)) < 0) - return ret; + data = av_malloc(asf_pkt->data_size + AV_INPUT_BUFFER_PADDING_SIZE); + if (!data) + return AVERROR(ENOMEM); + memset(data + asf_pkt->data_size, 0, AV_INPUT_BUFFER_PADDING_SIZE); while (asf_pkt->data_size >= asf_st->span * pkt_len + pos) { if (pos >= asf_pkt->data_size) { @@ -1409,20 +1413,22 @@ static int asf_deinterleave(AVFormatContext *s, ASFPacket *asf_pkt, int st_num) for (j = 0; j < asf_st->span; j++) { if ((pos + chunk_len) >= asf_pkt->data_size) break; - memcpy(pkt.data + pos, + memcpy(data + pos, p + (j * nchunks + l) * chunk_len, chunk_len); pos += chunk_len; } } p += asf_st->span * pkt_len; - if (p > asf_pkt->avpkt.data + asf_pkt->data_size) + if (p > asf_pkt->avpkt->data + asf_pkt->data_size) break; } - av_packet_unref(&asf_pkt->avpkt); - asf_pkt->avpkt = pkt; + av_packet_unref(asf_pkt->avpkt); + ret = av_packet_from_data(asf_pkt->avpkt, data, asf_pkt->data_size); + if (ret < 0) + av_free(data); - return 0; + return ret; } static int asf_read_packet(AVFormatContext *s, AVPacket *pkt) @@ -1492,7 +1498,7 @@ static int asf_read_packet(AVFormatContext *s, AVPacket *pkt) asf->asf_st[i]->type == AVMEDIA_TYPE_AUDIO) if ((ret = asf_deinterleave(s, asf_pkt, i)) < 0) return ret; - av_packet_move_ref(pkt, &asf_pkt->avpkt); + av_packet_move_ref(pkt, asf_pkt->avpkt); pkt->stream_index = asf->asf_st[i]->index; pkt->flags = asf_pkt->flags; pkt->dts = asf_pkt->dts - asf->preroll; @@ -1517,7 +1523,7 @@ static int asf_read_close(AVFormatContext *s) for (i = 0; i < ASF_MAX_STREAMS; i++) { av_dict_free(&asf->asf_sd[i].asf_met); if (i < asf->nb_streams) { - av_packet_unref(&asf->asf_st[i]->pkt.avpkt); + av_packet_free(&asf->asf_st[i]->pkt.avpkt); av_freep(&asf->asf_st[i]); } } @@ -1567,9 +1573,12 @@ static int64_t asf_read_timestamp(AVFormatContext *s, int stream_index, { ASFContext *asf = s->priv_data; int64_t pkt_pos = *pos, pkt_offset, dts = AV_NOPTS_VALUE, data_end; - AVPacket pkt; + AVPacket *pkt = av_packet_alloc(); int n; + if (!pkt) + return AVERROR(ENOMEM); + data_end = asf->data_offset + asf->data_size; n = (pkt_pos - asf->first_packet_offset + asf->packet_size - 1) / @@ -1585,9 +1594,9 @@ static int64_t asf_read_timestamp(AVFormatContext *s, int stream_index, int i, ret, st_found; - av_init_packet(&pkt); pkt_offset = avio_tell(s->pb); - if ((ret = asf_read_packet(s, &pkt)) < 0) { + if ((ret = asf_read_packet(s, pkt)) < 0) { + av_packet_free(&pkt); dts = AV_NOPTS_VALUE; return ret; } @@ -1599,11 +1608,11 @@ static int64_t asf_read_timestamp(AVFormatContext *s, int stream_index, ASFStream *st = asf->asf_st[i]; st_found = 0; - if (pkt.flags & AV_PKT_FLAG_KEY) { - dts = pkt.dts; + if (pkt->flags & AV_PKT_FLAG_KEY) { + dts = pkt->dts; if (dts) { - av_add_index_entry(s->streams[pkt.stream_index], pkt_pos, - dts, pkt.size, 0, AVINDEX_KEYFRAME); + av_add_index_entry(s->streams[pkt->stream_index], pkt_pos, + dts, pkt->size, 0, AVINDEX_KEYFRAME); if (stream_index == st->index) { st_found = 1; break; @@ -1613,11 +1622,11 @@ static int64_t asf_read_timestamp(AVFormatContext *s, int stream_index, } if (st_found) break; - av_packet_unref(&pkt); + av_packet_unref(pkt); } *pos = pkt_pos; - av_packet_unref(&pkt); + av_packet_free(&pkt); return dts; }