From patchwork Wed Apr 6 20:27:17 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 35231 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c05:b0:7a:e998:b410 with SMTP id bw5csp1114040pzb; Wed, 6 Apr 2022 13:25:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxZE+xVFPEDUS87f3ocEnHLwRmex923r7Ug8iwuMp0+ZFFtmLbVMDtoGaQQdof4knzDWJ4a X-Received: by 2002:a05:6402:4254:b0:419:245b:8051 with SMTP id g20-20020a056402425400b00419245b8051mr10635146edb.295.1649276719542; Wed, 06 Apr 2022 13:25:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649276719; cv=none; d=google.com; s=arc-20160816; b=LO50j1OJ5Gw2lzJGMEfEp2cNlxDpaKM4pg7pXz7BaKOP8xq/t+9m537f3MjBgZGGjf xp5U1PfMMffZGWLRXz7bC8Z3HDO2OjSro3Y/41qSKZzVAFEuleqofgqqfPhqBTak2sKp DpbuE52pW19ZdSXtEVcVOkMqk1wBhqOd2iPY317kPsNw4hj322XavOq/4Hrw/skrk7LY jfwCrskypGXUNwj2846rgIZj3/VDDHFgWRjUUfRlqBb8aGZmq8cDeGPOkXO52/zA70n1 KaqPSk8xbHSWzpTiNBp4uwx0pySJjQNLaIPT9raQ55dOkO46dyW/r/4oMQTUIa1On14F F/qA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=/R9ZH1ZTMZA5v8wOvf1Yb7Ffd1mhu/59600XC/350Ew=; b=dL2aXGQmnd2Sjx+NGI00Z7SkWz+I4kcCMhgmhtF90+eld0YJeRRx+1M5BSDorbDwJj TNIhGOUg3hOTB2w2UKqeP28ATuPLNhBXwYMlnABhyUAl8GiMGgBM7veO5HkzES5D9U9z uh1L8J+IyR/G7KbyESEYD4qWBC9t1LuFNIjqPUDPQHx+woy/Sx58MGhSxl8Ws0QOash7 hS3wJWTDx0xgh3ULnGIVMLqx16Q8D2GWvW0Pi/D1GDKcH+OPxx3h9UM/u1fiNwi5pIiz eJnsOy8buXWBIuPzRC7JT+ClyqQhuDzQ8BGx5WJEzXOErJyIPPxDebmJAD6XD530apKh zUvg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=TDEbHe57; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y13-20020a056402270d00b0041934a77e93si13580469edd.109.2022.04.06.13.25.18; Wed, 06 Apr 2022 13:25:19 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=TDEbHe57; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BB7AC68B1BA; Wed, 6 Apr 2022 23:25:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f42.google.com (mail-ej1-f42.google.com [209.85.218.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 76E3468A466 for ; Wed, 6 Apr 2022 23:25:08 +0300 (EEST) Received: by mail-ej1-f42.google.com with SMTP id bh17so6595667ejb.8 for ; Wed, 06 Apr 2022 13:25:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=XfpOlmT4+WnxW1DgqVrD54F1/GcmNprq76RdLRddlgo=; b=TDEbHe57VPKU2tQ0olO8IFxFa1lUAyU4rOjJ0LsI5o4ac4PCAW3oFH9XbezM3H/IrZ NNv23SMSYJAzurCXvT7foVXsLEdIN4xhyNd1XIGT7Cls4dDsvKGUrayh3an2VAsPL2Nw MoLFDkrZTgvEinJb2FNQYw7UbOZwSNfURI+eSSwSoar3lduDx9S8qUEyc0Ca+iU7S553 IRtyGf1viNDdi21GfMBinl7xo2U1cAG89IhZqprFs0jT3+4fkDiiC3cAHzg+ursxsgGH hqf7Ozu0HHbRi+xwsgA6xHYE7QTSKvqkoE1wWzuRfAnjMmH+forRJ3GCWzynU7vRpZmp +hUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=XfpOlmT4+WnxW1DgqVrD54F1/GcmNprq76RdLRddlgo=; b=hxOfaTvc2cz3YWOk5oCZjiehz9RbUdhuKYpd1DsSRIH1/72PoH0u+JOs0cSVAw6Msm usfyvs097WMpizXZuISwijf8lfySJe5wzuUeOYD3wd3eRgDP4SYhMHWBVX0d9TDSHuKX oJ/2jZhjnTapQzylr7uHq/JuSj0N2oZoJyc7eQp1hIAWmT2N3fP2+xGcECJS/ZGe4kCC 7ZDxLrEt+6PZjcMNCEkTz3eYk0n6M2UM23Vqld/Wv1yZBy9r9ZWDSGRGZaECkgqAFsIh QwD/1rx6Y8nqpsSg1+WTcpbVJsIg+VjqE42hAMyQ7GWUsbpIIeLbumr0KprF893xHxub ldrw== X-Gm-Message-State: AOAM532lkhF71gFZM3wePjH/auZDumRfELCTErW+Vfab0CC8YtPKEouC OGLSVncCFa19nBZSFrtiS4CvddPI9n8= X-Received: by 2002:a17:907:968b:b0:6e7:c54e:66f5 with SMTP id hd11-20020a170907968b00b006e7c54e66f5mr10102494ejc.467.1649276706767; Wed, 06 Apr 2022 13:25:06 -0700 (PDT) Received: from localhost.localdomain ([212.15.178.3]) by smtp.gmail.com with ESMTPSA id o18-20020a170906769200b006e7fc91251esm3149049ejm.215.2022.04.06.13.25.04 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Apr 2022 13:25:06 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Wed, 6 Apr 2022 22:27:17 +0200 Message-Id: <20220406202717.107763-1-onemda@gmail.com> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avformat/smacker: add better seeking support X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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" X-TUID: lgTszIM7oZYC Signed-off-by: Paul B Mahol --- libavformat/smacker.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/libavformat/smacker.c b/libavformat/smacker.c index 80d36f2f40..eac50040d7 100644 --- a/libavformat/smacker.c +++ b/libavformat/smacker.c @@ -94,6 +94,7 @@ static int smacker_read_header(AVFormatContext *s) AVStream *st; AVCodecParameters *par; uint32_t magic, width, height, flags, treesize; + int64_t pos; int i, ret, pts_inc; int tbase; @@ -211,8 +212,13 @@ static int smacker_read_header(AVFormatContext *s) smk->frm_flags = (void*)(smk->frm_size + smk->frames); /* read frame info */ + pos = 0; for (i = 0; i < smk->frames; i++) { smk->frm_size[i] = avio_rl32(pb); + if ((ret = av_add_index_entry(st, pos, i, smk->frm_size[i], 0, + (i == 0 || (smk->frm_size[i] & 1)) ? AVINDEX_KEYFRAME : 0)) < 0) + return ret; + pos += smk->frm_size[i]; } if ((ret = ffio_read_size(pb, smk->frm_flags, smk->frames)) < 0 || /* load trees to extradata, they will be unpacked by decoder */ @@ -335,7 +341,7 @@ static int smacker_read_packet(AVFormatContext *s, AVPacket *pkt) if ((ret = av_new_packet(pkt, smk->frame_size + 769)) < 0) goto next_frame; flags = smk->new_palette; - if (smk->frm_size[smk->cur_frame] & 1) + if ((smk->frm_size[smk->cur_frame] & 1) || smk->cur_frame == 0) flags |= 2; pkt->data[0] = flags; memcpy(pkt->data + 1, smk->pal, 768); @@ -344,6 +350,9 @@ static int smacker_read_packet(AVFormatContext *s, AVPacket *pkt) goto next_frame; pkt->stream_index = smk->videoindex; pkt->pts = smk->cur_frame; + pkt->duration = 1; + if (flags & 2) + pkt->flags |= AV_PKT_FLAG_KEY; smk->next_audio_index = 0; smk->new_palette = 0; smk->cur_frame++; @@ -359,20 +368,28 @@ next_frame: static int smacker_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) { + AVStream *st = s->streams[stream_index]; SmackerContext *smk = s->priv_data; - int64_t ret; + int64_t pos; + int ret; - /* only rewinding to start is supported */ - if (timestamp != 0) { - av_log(s, AV_LOG_ERROR, - "Random seeks are not supported (can only seek to start).\n"); + if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL)) + return -1; + + if (timestamp < 0 || timestamp >= smk->frames) return AVERROR(EINVAL); - } - if ((ret = avio_seek(s->pb, ffformatcontext(s)->data_offset, SEEK_SET)) < 0) + ret = av_index_search_timestamp(st, timestamp, flags); + if (ret < 0) return ret; - smk->cur_frame = 0; + pos = ffformatcontext(s)->data_offset; + pos += ffstream(st)->index_entries[ret].pos; + pos = avio_seek(s->pb, pos, SEEK_SET); + if (pos < 0) + return pos; + + smk->cur_frame = ret; smk->next_audio_index = 0; smk->new_palette = 0; memset(smk->pal, 0, sizeof(smk->pal));