From patchwork Wed Jul 15 06:50:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Buzdyk X-Patchwork-Id: 21032 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 38AD444B5A2 for ; Wed, 15 Jul 2020 10:51:27 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1372C68B2B1; Wed, 15 Jul 2020 10:51:27 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f68.google.com (mail-ed1-f68.google.com [209.85.208.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0000B6880AB for ; Wed, 15 Jul 2020 10:51:19 +0300 (EEST) Received: by mail-ed1-f68.google.com with SMTP id z17so880638edr.9 for ; Wed, 15 Jul 2020 00:51:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=F/Hc+xTG6MCt62sG93LUFdVQlhX6MdqOPxyz9DqSaC0=; b=hCWMWRO+rh1IFjWQl1fwl43Fw38881nQ6eDTo3stReqfQKksBA87oeESbxuEoB3oSZ mfvwsuAwWlwRraSXMccW9OEml7p3Wp38sKLNgXRZIY87rbvAGMK5i1/vejrgIUvs4l5P cuG1LG2tBQFnGCYmqlKftXCqdm+BG8M77mvTDJ9bCWjk601/b+zJRnhlgprM7YgmTr+d FZHucXJMrPN7yBwHQoT/o9fDaKio0AjOadM3siKdN3PSvZl/rPr7w17XF4+SnkNflmM5 HLHzifehp9dwH6huiBj0GKRHkdcD1cCQuC0DahD7AyxgeRrfQnwNG5Y6iZ1AeEMcos68 x8BQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=F/Hc+xTG6MCt62sG93LUFdVQlhX6MdqOPxyz9DqSaC0=; b=Cv5WsArLYK/0jyy5pmJ4FqZHWFHYCsyYYBM7eKJ8E5mgiQKkwQOdPRGEWlx6xTbKxm lH32SaWN3oI88xV5agfLpoGhlEKP9ioRPmg2J+sFPk+QC7lgMVjod0GZwD7tJ6h5eIvV 1TD+1GUXjCHccB18AnpVIGccJ3s1whpmVVwauOag6IocoItb7XDbrqA6O0GUEcz2GhBB zvdoGyPIx8qURTbhayEZ4oAOLZwNVX7aDLBqI1O9gOrObdw9+/21WwHcyhiv6GmwNEcn VnQ6JNS54DDteuk28SaVwie8VdLwck7AWTurjuFA9Y5KsmH9+S13Pt8JO8XMU0YEBqzD X1/A== X-Gm-Message-State: AOAM533mZnUfsQJdBHOAnOOYuvZAZoFjKy+jhLCWYvyiPu6+Yd5RhJ4n TP7bXAgeBKaYcRY0NqTErT7dztAl3qU= X-Google-Smtp-Source: ABdhPJyXtVEHNb/ombNOxY3sMQCFqLR7uwX1/nt5z85yTNxSo3ZSDfntJUhv1QyHl/K1hlZPDT3/7w== X-Received: by 2002:a19:87c2:: with SMTP id j185mr3982329lfd.183.1594795862926; Tue, 14 Jul 2020 23:51:02 -0700 (PDT) Received: from localhost.localdomain ([185.57.31.227]) by smtp.gmail.com with ESMTPSA id o1sm288457lfi.92.2020.07.14.23.51.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jul 2020 23:51:02 -0700 (PDT) From: Dima Buzdyk To: ffmpeg-devel@ffmpeg.org Date: Wed, 15 Jul 2020 16:50:56 +1000 Message-Id: <20200715065057.548738-1-dima.buzdyk@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] avdevice/v4l2: add support for HEVC payloads 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 Cc: Dima Buzdyk Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" * Add mapping for V4L2_PIX_FMT_HEVC payloads * Request bitstream parsing just like H264 Signed-off-by: Dima Buzdyk --- libavdevice/v4l2-common.c | 3 +++ libavdevice/v4l2.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) This change add support for HEVC playback for v4l2 devices. Corresponding Linux kernel patch for UVC devices submitted to https://patchwork.kernel.org/patch/11577395/ Sample output of ffmpeg for camera capable of HEVC streaming: 1. Available formats: ~/packages/ffmpeg/ffmpeg-git$ ./ffmpeg -f v4l2 -list_formats all -i /dev/video2 ffmpeg version 4.3.git Copyright (c) 2000-2020 the FFmpeg developers built with gcc 9 (Ubuntu 9.3.0-10ubuntu2) configuration: libavutil 56. 55.100 / 56. 55.100 libavcodec 58. 96.100 / 58. 96.100 libavformat 58. 48.100 / 58. 48.100 libavdevice 58. 11.101 / 58. 11.101 libavfilter 7. 87.100 / 7. 87.100 libswscale 5. 8.100 / 5. 8.100 libswresample 3. 8.100 / 3. 8.100 [video4linux2,v4l2 @ 0x55c04e131700] Compressed: h264 : H.264 : 1440x1920 [video4linux2,v4l2 @ 0x55c04e131700] Compressed: hevc : HEVC : 1440x1920 [video4linux2,v4l2 @ 0x55c04e131700] Compressed: mjpeg : Motion-JPEG : 3000x4000 /dev/video2: Immediate exit requested 2. ffprobe output for given input format: ~/packages/ffmpeg/ffmpeg-git$ ./ffprobe -f v4l2 -input_format hevc -i /dev/video2 ffprobe version 4.3.git Copyright (c) 2007-2020 the FFmpeg developers built with gcc 9 (Ubuntu 9.3.0-10ubuntu2) configuration: libavutil 56. 55.100 / 56. 55.100 libavcodec 58. 96.100 / 58. 96.100 libavformat 58. 48.100 / 58. 48.100 libavdevice 58. 11.101 / 58. 11.101 libavfilter 7. 87.100 / 7. 87.100 libswscale 5. 8.100 / 5. 8.100 libswresample 3. 8.100 / 3. 8.100 Input #0, video4linux2,v4l2, from '/dev/video2': Duration: N/A, start: 416791.927897, bitrate: N/A Stream #0:0: Video: hevc (Main), yuv420p(tv), 1440x1920, 30 fps, 30 tbr, 1000k tbn, 29.97 tbc diff --git a/libavdevice/v4l2-common.c b/libavdevice/v4l2-common.c index b5b4448a31..353e83efdd 100644 --- a/libavdevice/v4l2-common.c +++ b/libavdevice/v4l2-common.c @@ -55,6 +55,9 @@ const struct fmt_map ff_fmt_conversion_table[] = { #ifdef V4L2_PIX_FMT_H264 { AV_PIX_FMT_NONE, AV_CODEC_ID_H264, V4L2_PIX_FMT_H264 }, #endif +#ifdef V4L2_PIX_FMT_HEVC + { AV_PIX_FMT_NONE, AV_CODEC_ID_HEVC, V4L2_PIX_FMT_HEVC }, +#endif #ifdef V4L2_PIX_FMT_MPEG4 { AV_PIX_FMT_NONE, AV_CODEC_ID_MPEG4, V4L2_PIX_FMT_MPEG4 }, #endif diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c index 365bacd771..70e0f620f8 100644 --- a/libavdevice/v4l2.c +++ b/libavdevice/v4l2.c @@ -960,7 +960,7 @@ static int v4l2_read_header(AVFormatContext *ctx) if (codec_id == AV_CODEC_ID_RAWVIDEO) st->codecpar->codec_tag = avcodec_pix_fmt_to_codec_tag(st->codecpar->format); - else if (codec_id == AV_CODEC_ID_H264) { + else if (codec_id == AV_CODEC_ID_H264 || codec_id == AV_CODEC_ID_HEVC) { st->need_parsing = AVSTREAM_PARSE_FULL_ONCE; } if (desired_format == V4L2_PIX_FMT_YVU420) From patchwork Wed Jul 15 06:50:57 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Buzdyk X-Patchwork-Id: 21029 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 2501B44B141 for ; Wed, 15 Jul 2020 09:58:25 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EBD7768B45C; Wed, 15 Jul 2020 09:58:24 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f67.google.com (mail-ej1-f67.google.com [209.85.218.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6F45C68A9BB for ; Wed, 15 Jul 2020 09:58:17 +0300 (EEST) Received: by mail-ej1-f67.google.com with SMTP id p20so993969ejd.13 for ; Tue, 14 Jul 2020 23:58:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Hy946LCUFIdUkX41+C7NjNozn1JivokMk0roG8k7V8E=; b=N2lvzEUwn9O7IELZq5Xx3vhgmcKhQsaIFfrK5C1fYe/1JMKy+aKmUzIxk2clQV1NVV Wh/TebOyPWdesr9xzbuFS8IMcz7J5KbH7yMIMSQuwgbrNFoK8ExPleNVxw6yTV8VcdF0 MNNoDlB/vrLpxqfbaibKcwELsdmsuy8hXTsN5ZyEOlxpW/uf49YVI6nktw189B2x40Nb Z28lAzuEz4JOPLQUQjXg049Bw/ntdOzdavMJ80o3W6Kxr5e0w7xoxSevCPWkdeQfuPua V07/WJgUIfekpnjuMMKH9MMIYy5DiLLhoaD6hAoKs5O+hTSTqt8ECg5SFZr8OZsr60ZB RI+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Hy946LCUFIdUkX41+C7NjNozn1JivokMk0roG8k7V8E=; b=a3savKrsab/okPpX/GvgLW11RI9/pO6Gc+3SnSdjoNfjLddHKLaApD/iMzfFrA7zDC BWfpixU+pehdsLVcmLfkd7/ZBM03WAXB+Oel73N8Cho1lXMAv5wUMrUgjkL279lOZQLV k/fF1PDM7hvR+xDUtXaMuAcgTs1XJEKP068vyowvhCbkmVrfzRym/7jCVH5zFeC7bhE+ d06z8J6+uAx1f61XXYsSd2QFSa8xxNvQVOUsoi9cxXMZYWxrgozQuxL3DG9YbSvBRnmd tt5XYBJjyvjAI10Pe03fQLEzyyoT2vFH9EEP+XYcrqU7lAGMYOKDIoJ+z1AOUw3uXVZF FBMA== X-Gm-Message-State: AOAM533p7NHBJYWJaOuIWNtnY1eux1zXnHggcWGwLh4DgToPObgDTiLA eQCbog7Ph+OnMRjEQvvHIGLTlsedY2o= X-Google-Smtp-Source: ABdhPJxSUh6FG/ubEIV+q77rZ7QSulqLi1tbSvpA6KYU/eHQ74kyAs27pbeHTeBp70mV//Avo6z+ZA== X-Received: by 2002:a2e:8954:: with SMTP id b20mr4266009ljk.262.1594795866036; Tue, 14 Jul 2020 23:51:06 -0700 (PDT) Received: from localhost.localdomain ([185.57.31.227]) by smtp.gmail.com with ESMTPSA id o1sm288457lfi.92.2020.07.14.23.51.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jul 2020 23:51:05 -0700 (PDT) From: Dima Buzdyk To: ffmpeg-devel@ffmpeg.org Date: Wed, 15 Jul 2020 16:50:57 +1000 Message-Id: <20200715065057.548738-2-dima.buzdyk@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200715065057.548738-1-dima.buzdyk@gmail.com> References: <20200715065057.548738-1-dima.buzdyk@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] avcodec/hevc_parser: handle PARSER_FLAG_ONCE 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 Cc: Dima Buzdyk Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" * make HEVC parser respect PARSER_FLAG_ONCE flag Signed-off-by: Dima Buzdyk --- libavcodec/hevc_parser.c | 4 ++++ libavformat/avformat.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/libavcodec/hevc_parser.c b/libavcodec/hevc_parser.c index 5af4b788d5..d0c9aa6e44 100644 --- a/libavcodec/hevc_parser.c +++ b/libavcodec/hevc_parser.c @@ -331,6 +331,10 @@ static int hevc_parse(AVCodecParserContext *s, AVCodecContext *avctx, if (!is_dummy_buf) parse_nal_units(s, buf, buf_size, avctx); + if (s->flags & PARSER_FLAG_ONCE) { + s->flags &= PARSER_FLAG_COMPLETE_FRAMES; + } + *poutbuf = buf; *poutbuf_size = buf_size; return next; diff --git a/libavformat/avformat.h b/libavformat/avformat.h index e91e7f1d33..044921b2e4 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -786,7 +786,7 @@ enum AVStreamParseType { AVSTREAM_PARSE_FULL, /**< full parsing and repack */ AVSTREAM_PARSE_HEADERS, /**< Only parse headers, do not repack. */ AVSTREAM_PARSE_TIMESTAMPS, /**< full parsing and interpolation of timestamps for frames not starting on a packet boundary */ - AVSTREAM_PARSE_FULL_ONCE, /**< full parsing and repack of the first frame only, only implemented for H.264 currently */ + AVSTREAM_PARSE_FULL_ONCE, /**< full parsing and repack of the first frame only, only implemented for H.264 and HEVC currently */ AVSTREAM_PARSE_FULL_RAW, /**< full parsing and repack with timestamp and position generation by parser for raw this assumes that each packet in the file contains no demuxer level headers and just codec level data, otherwise position generation would fail */