From patchwork Sun Jan 21 14:18:41 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jianfeng Zheng X-Patchwork-Id: 45687 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:a402:b0:199:de12:6fa6 with SMTP id z2csp943677pzk; Sun, 21 Jan 2024 06:19:24 -0800 (PST) X-Google-Smtp-Source: AGHT+IGph0XU1jc8rohj/4/ymJljebDwctbfSijSLoF1I8yFTLuUHdI/o9wjAKkfwQ25vCa3u3hj X-Received: by 2002:a17:907:c314:b0:a30:393e:410b with SMTP id tl20-20020a170907c31400b00a30393e410bmr263642ejc.185.1705846763974; Sun, 21 Jan 2024 06:19:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1705846763; cv=none; d=google.com; s=arc-20160816; b=u96YZIYXAYwOso4tkgiu04IAcI/CPa7jeJlKJh5OeGnA+/UofGlb5nOHF71vlXbmau 7fbVJEmudUByyazO+K0c0WH+FP/OUrTGfUcEt0iJcgNJjZJdX4CATJi933L/vSON6PLe QV29irE7qh3YX6Rs/vSNw4mhsa+6s89XWm2iL/uTBRaJAxCtb8Z9h827qJEVZCaZs/45 nR4yK84mAhj6L5jrYt4fCLcA5NvYR1EvQWQh975ngMLVGaY2YpBKvVWHFCin6kS2389g /TbQ4T+3FZQZvhqiPB0ajqN+vtdWZfDAOpTYVtIx8AhcbtZ6Dfb/1gVbKn4WmQ3w2SL5 8Cfg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=t7pR37odR26sKiEIykXXnPywDpm3alFuzvq9k+pnWPU=; fh=iiAW4vjlCGdXV3Yszi/eNCPr6t9/oDQbs1mdNL59KvI=; b=yX3Imtu3PGDohpvdzyaW+XDD4mGEb6uxHNsYcOytpFjMPFsTptONLPgaJoNAwZqX0P mZV2Dje89R6RPiJtQV5FAGGzwd4JIqRgQxtbh9BB7+d8y26SUpjQUU3jWccze7XRDnli OylxO7aq0TURPXlxYVhN/ib+9PF1NE4lbrZIzGn+VOWdyf7YezgNui0SuJ3bT+eSRX5+ 60Ow2r3VTAUHo4R2VOnQuDt9Ov17g6HAbw3rcbkXn4p3ShAvI938/AgBlPqZRx6jhf/b mWEr0ngc3kAvw5b1zhw+VfqQxv6LMQa4B89KBsbcHEPq6f5KFczXZqcklSb9ELBxoqL/ gYzA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=RcLDsmMS; 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 e3-20020a17090681c300b00a2f0df863aesi3871902ejx.450.2024.01.21.06.19.23; Sun, 21 Jan 2024 06:19:23 -0800 (PST) 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=20230601 header.b=RcLDsmMS; 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 DEFCE68D033; Sun, 21 Jan 2024 16:19:18 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f177.google.com (mail-pg1-f177.google.com [209.85.215.177]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 79E4568D033 for ; Sun, 21 Jan 2024 16:19:11 +0200 (EET) Received: by mail-pg1-f177.google.com with SMTP id 41be03b00d2f7-5ceb3fe708eso925723a12.3 for ; Sun, 21 Jan 2024 06:19:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1705846749; x=1706451549; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=K4JYsrgC2PjbtzY9Vs/RAN3nvulMwAmwSNEl/2WGHrY=; b=RcLDsmMSDu0t/u0F62LfkjsuNRo4AOx+0IX8wIuYIRuVAY+b7ShWRwIi7DDgxh23/Q wa7RBdF4WY5pOIw0kqrcqDPMPuUkhsmvrMh9ESSauhvFilT0yFMWMX7/+PVX5nS7sBJC YqbDgizqUsvXwcRyUVQzODDsqATgSk8A5zg3wA2nIgroDf3OzQEsWJ9wRGmM3Jz1ApNZ sZZT7aIISgIkhclll5+VtzAbEZK+yH+sODL+18lqLg0Bea6ANKHzFcEzGIrBHgIGnt32 FCYhm8GQjahxAH9gHcpPrENP49sJz0niK2DHnfSq7OXhUc8wO1WbMu3dGqOLU1A1RI1c pZVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705846749; x=1706451549; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=K4JYsrgC2PjbtzY9Vs/RAN3nvulMwAmwSNEl/2WGHrY=; b=KblbU0GV1acLU0wWnCYi1wX9lB4OMatFXcquwul7nd9wePd0rfmOY3fewyB3G3nzo5 YRaSaKxdeFLTbHHQFOrfjUp1uE59KW/44jxRr5v1PVAHKlEZYjEuchaXQmGovMueRz3/ 5q5ShaxsAg2qunPuodtvom5+0+lGk8J/j67BAX4s65cZAjWQwLWq+RwP2ebg5hP5LwHt xKEm+dk/zf2mKPYlsXosMbLd2avo6EhKrAMgWEyTw51Ay2ODgg8UuPB2tcK2fLDVXTeG RflV+Ny1O0/gKKqmvl7OXkSKOwu5Hrlcv+NmXAv8qmbusNxsQpwG/kqjVvMA7PS7pJfA JEuw== X-Gm-Message-State: AOJu0YyZxlBoLKlNn2VXXczCMrEIqHiRgFax0ojrHIkxVT1930mFVbk6 W27zGcKDkqn+5MXXdXVU2KeENbn9z7dYNGNdxcsRuXTRkysQmPh6TAE1VHdH0cU= X-Received: by 2002:a17:902:d48e:b0:1d7:683:5a31 with SMTP id c14-20020a170902d48e00b001d706835a31mr1376232plg.133.1705846749302; Sun, 21 Jan 2024 06:19:09 -0800 (PST) Received: from localhost.localdomain ([183.242.63.6]) by smtp.gmail.com with ESMTPSA id bg4-20020a1709028e8400b001d4b73f60e4sm5840726plb.149.2024.01.21.06.19.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 21 Jan 2024 06:19:08 -0800 (PST) From: "jianfeng.zheng" X-Google-Original-From: "jianfeng.zheng" To: ffmpeg-devel@ffmpeg.org Date: Sun, 21 Jan 2024 22:18:41 +0800 Message-Id: <20240121141846.4077778-2-jianfeng.zheng@mthreads.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240121141846.4077778-1-jianfeng.zheng@mthreads.com> References: <20240121141846.4077778-1-jianfeng.zheng@mthreads.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [vaapi-cavs 2/7] cavs: skip bits between pic header and slc header 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 Cc: "jianfeng.zheng" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: tgSYDyZ7Ba1a Signed-off-by: jianfeng.zheng --- libavcodec/cavs.h | 2 + libavcodec/cavsdec.c | 87 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/libavcodec/cavs.h b/libavcodec/cavs.h index 244c322b35..ad49abff92 100644 --- a/libavcodec/cavs.h +++ b/libavcodec/cavs.h @@ -39,8 +39,10 @@ #define EXT_START_CODE 0x000001b5 #define USER_START_CODE 0x000001b2 #define CAVS_START_CODE 0x000001b0 +#define VIDEO_SEQ_END_CODE 0x000001b1 #define PIC_I_START_CODE 0x000001b3 #define PIC_PB_START_CODE 0x000001b6 +#define VIDEO_EDIT_CODE 0x000001b7 #define A_AVAIL 1 #define B_AVAIL 2 diff --git a/libavcodec/cavsdec.c b/libavcodec/cavsdec.c index b356da0b04..9742bd1011 100644 --- a/libavcodec/cavsdec.c +++ b/libavcodec/cavsdec.c @@ -954,6 +954,80 @@ static inline int decode_slice_header(AVSContext *h, GetBitContext *gb) return 0; } +/** + * skip stuffing bits before next start code "0x000001" + * @return '0' no stuffing bits placed at h->gb being skip, else '1'. + */ +static inline int skip_stuffing_bits(AVSContext *h) +{ + GetBitContext gb0 = h->gb; + GetBitContext *gb = &h->gb; + const uint8_t *start; + const uint8_t *ptr; + const uint8_t *end; + int align; + int stuffing_zeros; + + /** + * According to spec, there should be one stuffing_bit '1' and + * 0~7 stuffing_bit '0'. But seems not all the stream follow + * "next_start_code()" strictly. + */ + align = (-get_bits_count(gb)) & 7; + if (align == 0 && show_bits_long(gb, 8) == 0x80) { + skip_bits_long(gb, 8); + } + + /** + * skip leading zero bytes before 0x 00 00 01 stc + */ + ptr = start = align_get_bits(gb); + end = gb->buffer_end; + while (ptr < end && *ptr == 0) + ptr++; + + if ((ptr >= end) || (*ptr == 1 && ptr - start >= 2)) { + stuffing_zeros = (ptr >= end ? end - start : ptr - start - 2); + if (stuffing_zeros > 0) + av_log(h->avctx, AV_LOG_DEBUG, "Skip 0x%x stuffing zeros @0x%x.\n", + stuffing_zeros, (int)(start - gb->buffer)); + skip_bits_long(gb, stuffing_zeros * 8); + return 1; + } else { + av_log(h->avctx, AV_LOG_DEBUG, "No next_start_code() found @0x%x.\n", + (int)(start - gb->buffer)); + goto restore_get_bits; + } + +restore_get_bits: + h->gb = gb0; + return 0; +} + +static inline int skip_extension_and_user_data(AVSContext *h) +{ + int stc = -1; + const uint8_t *start = align_get_bits(&h->gb); + const uint8_t *end = h->gb.buffer_end; + const uint8_t *ptr, *next; + + for (ptr = start; ptr + 4 < end; ptr = next) { + stc = show_bits_long(&h->gb, 32); + if (stc != EXT_START_CODE && stc != USER_START_CODE) { + break; + } + next = avpriv_find_start_code(ptr + 4, end, &stc); + if (next < end) { + next -= 4; + } + skip_bits(&h->gb, (next - ptr) * 8); + av_log(h->avctx, AV_LOG_DEBUG, "skip %d byte ext/user data\n", + (int)(next - ptr)); + } + + return ptr > start; +} + static inline int check_for_slice(AVSContext *h) { GetBitContext *gb = &h->gb; @@ -1019,6 +1093,8 @@ static int decode_pic(AVSContext *h) h->stream_revision = 1; if (h->stream_revision > 0) skip_bits(&h->gb, 1); //marker_bit + + av_log(h->avctx, AV_LOG_DEBUG, "stream_revision: %d\n", h->stream_revision); } if (get_bits_left(&h->gb) < 23) @@ -1096,6 +1172,11 @@ static int decode_pic(AVSContext *h) h->alpha_offset = h->beta_offset = 0; } + if (h->stream_revision > 0) { + skip_stuffing_bits(h); + skip_extension_and_user_data(h); + } + ret = 0; if (h->cur.f->pict_type == AV_PICTURE_TYPE_I) { do { @@ -1309,6 +1390,12 @@ static int cavs_decode_frame(AVCodecContext *avctx, AVFrame *rframe, case USER_START_CODE: //mpeg_decode_user_data(avctx, buf_ptr, input_size); break; + case VIDEO_EDIT_CODE: + av_log(h->avctx, AV_LOG_WARNING, "Skip video_edit_code\n"); + break; + case VIDEO_SEQ_END_CODE: + av_log(h->avctx, AV_LOG_WARNING, "Skip video_sequence_end_code\n"); + break; default: if (stc <= SLICE_MAX_START_CODE) { init_get_bits(&h->gb, buf_ptr, input_size);