diff mbox series

[FFmpeg-devel,v3,2/2] lavf: add prores bitstream demuxer and muxer

Message ID PH7PR11MB743021AAFB6F2602B94C42C1C400A@PH7PR11MB7430.namprd11.prod.outlook.com
State New
Headers show
Series [FFmpeg-devel,v3,1/2] lavc: add prores bitstream parser | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

hung kuishing July 26, 2023, 9:28 a.m. UTC
Signed-off-by: clarkh <hungkuishing@outlook.com>
---
 libavformat/Makefile     |  2 ++
 libavformat/allformats.c |  2 ++
 libavformat/proresdec.c  | 66 ++++++++++++++++++++++++++++++++++++++++
 libavformat/rawenc.c     | 13 ++++++++
 4 files changed, 83 insertions(+)
 create mode 100644 libavformat/proresdec.c

Comments

Derek Buitenhuis July 26, 2023, 12:54 p.m. UTC | #1
On 7/26/2023 10:28 AM, hung kuishing wrote:
> Signed-off-by: clarkh <hungkuishing@outlook.com>
> ---
>  libavformat/Makefile     |  2 ++
>  libavformat/allformats.c |  2 ++
>  libavformat/proresdec.c  | 66 ++++++++++++++++++++++++++++++++++++++++
>  libavformat/rawenc.c     | 13 ++++++++
>  4 files changed, 83 insertions(+)
>  create mode 100644 libavformat/proresdec.c

At this point I am giving this a strong NAK.

Both my initial comment[1] and subsequent comment[2] about the first one being ignore,
have been ignored. It is a simple question.

- Derek

[1] http://ffmpeg.org/pipermail/ffmpeg-devel/2023-July/312552.html
[2] http://ffmpeg.org/pipermail/ffmpeg-devel/2023-July/312635.html
hung kuishing July 26, 2023, 2:59 p.m. UTC | #2
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of
> Derek Buitenhuis
> Sent: Wednesday, July 26, 2023 8:55 PM
> To: ffmpeg-devel@ffmpeg.org
> Subject: Re: [FFmpeg-devel] [PATCH v3 2/2] lavf: add prores bitstream
> demuxer and muxer
> 
> On 7/26/2023 10:28 AM, hung kuishing wrote:
> > Signed-off-by: clarkh <hungkuishing@outlook.com>
> > ---
> >  libavformat/Makefile     |  2 ++
> >  libavformat/allformats.c |  2 ++
> >  libavformat/proresdec.c  | 66
> ++++++++++++++++++++++++++++++++++++++++
> >  libavformat/rawenc.c     | 13 ++++++++
> >  4 files changed, 83 insertions(+)
> >  create mode 100644 libavformat/proresdec.c
> 
> At this point I am giving this a strong NAK.
> 
> Both my initial comment[1] and subsequent comment[2] about the
> first one being ignore, have been ignored. It is a simple question.

Sorry for not replying to your question in time!
This patch originated from a need in my work to wrap the ProRes bitstream generated by ffmpeg into another mov wrapper.
Kieran Kunhya July 26, 2023, 5:08 p.m. UTC | #3
On Wed, 26 Jul 2023 at 13:55, Derek Buitenhuis <derek.buitenhuis@gmail.com>
wrote:

> On 7/26/2023 10:28 AM, hung kuishing wrote:
> > Signed-off-by: clarkh <hungkuishing@outlook.com>
> > ---
> >  libavformat/Makefile     |  2 ++
> >  libavformat/allformats.c |  2 ++
> >  libavformat/proresdec.c  | 66 ++++++++++++++++++++++++++++++++++++++++
> >  libavformat/rawenc.c     | 13 ++++++++
> >  4 files changed, 83 insertions(+)
> >  create mode 100644 libavformat/proresdec.c
>
> At this point I am giving this a strong NAK.
>
> Both my initial comment[1] and subsequent comment[2] about the first one
> being ignore,
> have been ignored. It is a simple question.
>

I agree we should not be perpetuating custom formats such as raw ProRes.

Kieran
Andreas Rheinhardt July 26, 2023, 5:10 p.m. UTC | #4
hung kuishing:
>> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of
>> Derek Buitenhuis
>> Sent: Wednesday, July 26, 2023 8:55 PM
>> To: ffmpeg-devel@ffmpeg.org
>> Subject: Re: [FFmpeg-devel] [PATCH v3 2/2] lavf: add prores bitstream
>> demuxer and muxer
>>
>> On 7/26/2023 10:28 AM, hung kuishing wrote:
>>> Signed-off-by: clarkh <hungkuishing@outlook.com>
>>> ---
>>>  libavformat/Makefile     |  2 ++
>>>  libavformat/allformats.c |  2 ++
>>>  libavformat/proresdec.c  | 66
>> ++++++++++++++++++++++++++++++++++++++++
>>>  libavformat/rawenc.c     | 13 ++++++++
>>>  4 files changed, 83 insertions(+)
>>>  create mode 100644 libavformat/proresdec.c
>>
>> At this point I am giving this a strong NAK.
>>
>> Both my initial comment[1] and subsequent comment[2] about the
>> first one being ignore, have been ignored. It is a simple question.
> 
> Sorry for not replying to your question in time!
> This patch originated from a need in my work to wrap the ProRes bitstream generated by ffmpeg into another mov wrapper.

So there are no files in the wild for this? Then there is no point in
this. Or is this something that other mov wrappers (you meant muxers!?)
accept?
(Couldn't you just have used e.g. nut (or even mov itself) to
temporarily store the ProRes data and then pipe this to to the foreign
muxer?)

- Andreas
hung kuishing July 27, 2023, 8:16 a.m. UTC | #5
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of
> Andreas Rheinhardt
> Sent: Thursday, July 27, 2023 1:11 AM
> To: ffmpeg-devel@ffmpeg.org
> Subject: Re: [FFmpeg-devel] [PATCH v3 2/2] lavf: add prores bitstream
> demuxer and muxer
> 
> hung kuishing:
> >> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf
> Of
> >> Derek Buitenhuis
> >> Sent: Wednesday, July 26, 2023 8:55 PM
> >> To: ffmpeg-devel@ffmpeg.org
> >> Subject: Re: [FFmpeg-devel] [PATCH v3 2/2] lavf: add prores
> bitstream
> >> demuxer and muxer
> >>
> >> On 7/26/2023 10:28 AM, hung kuishing wrote:
> >>> Signed-off-by: clarkh <hungkuishing@outlook.com>
> >>> ---
> >>>  libavformat/Makefile     |  2 ++
> >>>  libavformat/allformats.c |  2 ++
> >>>  libavformat/proresdec.c  | 66
> >> ++++++++++++++++++++++++++++++++++++++++
> >>>  libavformat/rawenc.c     | 13 ++++++++
> >>>  4 files changed, 83 insertions(+)
> >>>  create mode 100644 libavformat/proresdec.c
> >>
> >> At this point I am giving this a strong NAK.
> >>
> >> Both my initial comment[1] and subsequent comment[2] about the
> first
> >> one being ignore, have been ignored. It is a simple question.
> >
> > Sorry for not replying to your question in time!
> > This patch originated from a need in my work to wrap the ProRes
> bitstream generated by ffmpeg into another mov wrapper.
> 
> So there are no files in the wild for this? Then there is no point in this. Or
> is this something that other mov wrappers (you meant muxers!?)
> accept?
> (Couldn't you just have used e.g. nut (or even mov itself) to temporarily
> store the ProRes data and then pipe this to to the foreign
> muxer?)

Hi, Andreas Rheinhardt:
Let me briefly describe what I needed at that time:
I have another prores encoder and another mov muxer, what I need to do are:
1. use "another mov muxer" to encapsulate prores bitstream generated by ffmpeg.
2. use ffmpeg to encapsulate prores bitstream generated by "another prores encoder" .

I know I can implement them by calling the ffmpeg api,  but how can I implement them by ffmpeg tool? 
So, I developed these patches.
Derek Buitenhuis July 27, 2023, 1:02 p.m. UTC | #6
On 7/27/2023 9:16 AM, hung kuishing wrote:
> Let me briefly describe what I needed at that time:
> I have another prores encoder and another mov muxer, what I need to do are:
> 1. use "another mov muxer" to encapsulate prores bitstream generated by ffmpeg.
> 2. use ffmpeg to encapsulate prores bitstream generated by "another prores encoder" .
> 
> I know I can implement them by calling the ffmpeg api,  but how can I implement them by ffmpeg tool? 
> So, I developed these patches.

So this format was created as a weird hack to enable the ffmpeg CLI to be jammed
into such a workflow.

My NAK remains.

- Derek
diff mbox series

Patch

diff --git a/libavformat/Makefile b/libavformat/Makefile
index bd78c206b9..16def0765b 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -480,6 +480,8 @@  OBJS-$(CONFIG_PDV_DEMUXER)               += pdvdec.o
 OBJS-$(CONFIG_PJS_DEMUXER)               += pjsdec.o subtitles.o
 OBJS-$(CONFIG_PMP_DEMUXER)               += pmpdec.o
 OBJS-$(CONFIG_PP_BNK_DEMUXER)            += pp_bnk.o
+OBJS-$(CONFIG_PRORES_DEMUXER)            += proresdec.o rawdec.o
+OBJS-$(CONFIG_PRORES_MUXER)              += rawenc.o
 OBJS-$(CONFIG_PVA_DEMUXER)               += pva.o
 OBJS-$(CONFIG_PVF_DEMUXER)               += pvfdec.o pcm.o
 OBJS-$(CONFIG_QCP_DEMUXER)               += qcp.o
diff --git a/libavformat/allformats.c b/libavformat/allformats.c
index 6324952bd2..0b762034ca 100644
--- a/libavformat/allformats.c
+++ b/libavformat/allformats.c
@@ -378,6 +378,8 @@  extern const AVInputFormat  ff_pdv_demuxer;
 extern const AVInputFormat  ff_pjs_demuxer;
 extern const AVInputFormat  ff_pmp_demuxer;
 extern const AVInputFormat  ff_pp_bnk_demuxer;
+extern const AVInputFormat  ff_prores_demuxer;
+extern const FFOutputFormat ff_prores_muxer;
 extern const FFOutputFormat ff_psp_muxer;
 extern const AVInputFormat  ff_pva_demuxer;
 extern const AVInputFormat  ff_pvf_demuxer;
diff --git a/libavformat/proresdec.c b/libavformat/proresdec.c
new file mode 100644
index 0000000000..67f25b79ec
--- /dev/null
+++ b/libavformat/proresdec.c
@@ -0,0 +1,66 @@ 
+/*
+ * ProRes bitstream probe
+ * Copyright (c) 2023 clarkh <hungkuishing@outlook.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/intreadwrite.h"
+#include "libavcodec/proresdata.h"
+#include "avformat.h"
+#include "rawdec.h"
+
+#define FRAME_FIXED_HEADER_SIZE 20
+
+static int prores_check_frame_header(const uint8_t *buf, const int data_size)
+{
+    int hdr_size, width, height;
+    int version, alpha_info;
+
+    hdr_size = AV_RB16(buf);
+    if (hdr_size < FRAME_FIXED_HEADER_SIZE)
+        return AVERROR_INVALIDDATA;
+
+    version = buf[3];
+    if (version > 1)
+        return AVERROR_INVALIDDATA;
+
+    width  = AV_RB16(buf + 8);
+    height = AV_RB16(buf + 10);
+    if (!width || !height)
+        return AVERROR_INVALIDDATA;
+
+    alpha_info = buf[17] & 0x0f;
+    if (alpha_info > 2)
+        return AVERROR_INVALIDDATA;
+
+    return 0;
+}
+
+static int prores_probe(const AVProbeData *p)
+{
+    // 8: frame_size(4B) + frame_identifier(4B)
+    if (p->buf_size < (8 + FRAME_FIXED_HEADER_SIZE) || AV_RB32(p->buf + 4) != FRAME_ID)
+        return 0;
+
+    if (prores_check_frame_header(p->buf + 8, p->buf_size - 8) < 0)
+        return 0;
+
+    return AVPROBE_SCORE_MAX;
+}
+
+FF_DEF_RAWVIDEO_DEMUXER(prores, "raw ProRes", prores_probe, "prores", AV_CODEC_ID_PRORES)
diff --git a/libavformat/rawenc.c b/libavformat/rawenc.c
index f916db13a2..28ca47ae70 100644
--- a/libavformat/rawenc.c
+++ b/libavformat/rawenc.c
@@ -538,6 +538,19 @@  const FFOutputFormat ff_obu_muxer = {
 };
 #endif
 
+#if CONFIG_PRORES_MUXER
+const FFOutputFormat ff_prores_muxer = {
+    .p.name            = "prores",
+    .p.long_name       = NULL_IF_CONFIG_SMALL("raw prores video"),
+    .p.extensions      = "prores",
+    .p.audio_codec     = AV_CODEC_ID_NONE,
+    .p.video_codec     = AV_CODEC_ID_PRORES,
+    .init              = force_one_stream,
+    .write_packet      = ff_raw_write_packet,
+    .p.flags           = AVFMT_NOTIMESTAMPS,
+};
+#endif
+
 #if CONFIG_RAWVIDEO_MUXER
 const FFOutputFormat ff_rawvideo_muxer = {
     .p.name            = "rawvideo",