[FFmpeg-devel] [PATCH] added support for hardware assist H264 video encoding for the Raspberry Pi

Aman Gupta ffmpeg at tmm1.net
Thu Jun 16 20:16:59 CEST 2016


The patchset that was merged into libav is now available in ffmpeg as well:
https://github.com/FFmpeg/FFmpeg/blob/master/libavcodec/omx.c

You can compile ffmpeg from the master branch
with --enable-omx --enable-omx-rpi

Aman

On Thu, Jun 16, 2016 at 2:16 AM, Amancio Hasty <ahasty at gmail.com> wrote:

>
> > On May 9, 2016, at 7:55 AM, Amancio Hasty <ahasty at gmail.com> wrote:
> >
> > Hi,
> >
> > So what is the next step?
> >
> > If you want testers I suggest posting to ccrisan’s motionpie mailing
> list.
> > Cheers
> > Amancio
> >
> >
> >> On Mar 31, 2016, at 7:27 PM, Amancio Hasty <ahasty at gmail.com> wrote:
> >>
> >> I am not a lawyer…
> >>
> >>
> >> I updated the patch.  vc264.c now has a the copyright notice embedded in
> >> a volatile global so if a binary is compiled against vc264.o , the
> copyright notice
> >> can be displayed by:
> >> strings ffmpeg | grep -i copyright
> >>
> >> LICENSE.md has been updated to include Broadcom’s copyright notice.
> >>
> >> A distribution of a  binary that includes vc264.o should include
> LICENSE.md and if
> >> that is missing,  the copyright notice can be displayed via the shell
> >> command ‘strings’ .
> >>
> >> Amancio
> >> <c-0001-added-support-for-hardware-assist-H264-video-encodin.patch>
> >>> On Mar 22, 2016, at 12:12 PM, Lou Logan <lou at lrcd.com> wrote:
> >>>
> >>> On Mon, 21 Mar 2016 20:07:01 -0700, Amancio Hasty wrote:
> >>>
> >>>> From 874a72eec2a78f4935fea091003e534b5f8d5413 Mon Sep 17 00:00:00 2001
> >>>> From: Amancio Hasty <ahasty at gmail.com>
> >>>> Date: Mon, 21 Mar 2016 18:56:05 -0700
> >>>> Subject: [PATCH] added support for hardware assist H264  video
> encoding for
> >>>> the Raspberry Pi
> >>>>
> >>>> ---
> >>>> configure              |  12 ++
> >>>> libavcodec/Makefile    |   1 +
> >>>> libavcodec/allcodecs.c |   2 +
> >>>> libavcodec/vc264.c     | 387
> +++++++++++++++++++++++++++++++++++++++++++++++++
> >>>> 4 files changed, 402 insertions(+)
> >>>> create mode 100644 libavcodec/vc264.c
> >>>>
> >>> [...]
> >>>> diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
> >>>> index 2a25d66..3c7bd9b 100644
> >>>> --- a/libavcodec/allcodecs.c
> >>>> +++ b/libavcodec/allcodecs.c
> >>>> @@ -74,6 +74,7 @@ void avcodec_register_all(void)
> >>>>   initialized = 1;
> >>>>
> >>>
> >>> Nit: Whitespace on the line above should be removed.
> >>>
> >>> [...]
> >>>> --- /dev/null
> >>>> +++ b/libavcodec/vc264.c
> >>>> @@ -0,0 +1,387 @@
> >>>> +/*  H.264 hardware assist video encoding code taken from
> >>>> + * raspberry's os :
> >>>> + *   /opt/vc/src/hello_pi/hello_encode/encode.c
> >>>> + */
> >>>> +
> >>>> +/*
> >>>> +Copyright (c) 2012, Broadcom Europe Ltd
> >>>> +Copyright (c) 2012, Kalle Vahlman <zuh at iki>
> >>>> +                    Tuomas Kulve <tuomas at kulve.fi>
> >>>> +All rights reserved.
> >>>> +
> >>>> +Redistribution and use in source and binary forms, with or without
> >>>> +modification, are permitted provided that the following conditions
> are met:
> >>>> +* Redistributions of source code must retain the above copyright
> >>>> +      notice, this list of conditions and the following disclaimer.
> >>>> +      * Redistributions in binary form must reproduce the above
> copyright
> >>>> +      notice, this list of conditions and the following disclaimer
> in the
> >>>> +      documentation and/or other materials provided with the
> distribution.
> >>>> +      * Neither the name of the copyright holder nor the
> >>>> +      names of its contributors may be used to endorse or promote
> products
> >>>> +      derived from this software without specific prior written
> permission.
> >>>> +
> >>>> +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> "AS IS" AND
> >>>> +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
> THE IMPLIED
> >>>> +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> ARE
> >>>> +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
> BE LIABLE FOR ANY
> >>>> +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> DAMAGES
> >>>> +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
> SERVICES;
> >>>> +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> CAUSED AND
> >>>> +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> OR TORT
> >>>> +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
> USE OF THIS
> >>>> +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> >>>
> >>> I wonder if any of the above legalese is compatible. Granted, I see a
> >>> similar paragraph in "libavformat/aadec.c".
> >>>
> >>>> + * ffmpeg driver for hardware assist video H.264 encoding using
> Broadcom's GPU
> >>>> + * Copyright (C) 2016 Amancio Hasty ahasty at gmail.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
> >>>> + *
> >>>> + */
> >>>> +
> >>>> +
> >>>> +/**
> >>>> + * @ file vc264.c
> >>>> + * Broadcom bm2865's Visual Core hardware assist h264 using
> >>>> +   openMax interface to the GPU.
> >>>> +
> >>>> +*/
> >>>> +
> >>>> +#include <stdio.h>
> >>>> +#include <stdlib.h>
> >>>> +#include <string.h>
> >>>> +#define OMX_SKIP64BIT
> >>>> +#include "bcm_host.h"
> >>>> +#include "ilclient.h"
> >>>> +#include "avcodec.h"
> >>>> +#include "internal.h"
> >>>> +
> >>>> +typedef struct VC264Context {
> >>>> +  OMX_VIDEO_PARAM_PORTFORMATTYPE format;
> >>>> +  OMX_PARAM_PORTDEFINITIONTYPE def;
> >>>> +  COMPONENT_T *video_encode;
> >>>> +  COMPONENT_T *list[5];
> >>>> +  OMX_BUFFERHEADERTYPE *buf;
> >>>> +  OMX_BUFFERHEADERTYPE *out;
> >>>> +  ILCLIENT_T *client;
> >>>> +  OMX_VIDEO_PARAM_BITRATETYPE bitrateType;
> >>>> +  int  width;
> >>>> +  int height;
> >>>> +  int bit_rate;
> >>>> +} VC264Context;
> >>>> +
> >>>> +
> >>>> +static int vc264_init(AVCodecContext *avctx) {
> >>>> +
> >>>> +
> >>>> +
> >>>> +   OMX_ERRORTYPE r;
> >>>> +   int error;
> >>>> +
> >>>> +
> >>>> +
> >>>> +   VC264Context *vc = avctx->priv_data;
> >>>> +
> >>>> +   vc->width = avctx->width;
> >>>> +   vc->height = avctx->height;
> >>>> +   vc->bit_rate = avctx->bit_rate;
> >>>> +   printf("vc264: bit rate %d \n", avctx->bit_rate);
> >>>> +#if FF_API_CODED_FRAME
> >>>> +FF_DISABLE_DEPRECATION_WARNINGS
> >>>> +
> >>>> +   avctx->coded_frame = av_frame_alloc();
> >>>> +   avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
> >>>> +FF_ENABLE_DEPRECATION_WARNINGS
> >>>> +#endif
> >>>> +
> >>>> +
> >>>> +   memset(&vc->list, 0, sizeof(vc->list));
> >>>> +   bcm_host_init();
> >>>> +   if ((vc->client = ilclient_init()) == NULL) {
> >>>> +      return -3;
> >>>> +   }
> >>>> +   error = OMX_Init();
> >>>> +
> >>>> +   if (error  != OMX_ErrorNone) {
> >>>> +      ilclient_destroy(vc->client);
> >>>> +      av_log(avctx,AV_LOG_ERROR,"in vc264_init OMX_Init failed ");
> >>>> +     return -4;
> >>>> +    }
> >>>> +
> >>>> +   // create video_encode
> >>>> +   r = ilclient_create_component(vc->client, &vc->video_encode,
> (char *) "video_encode",
> >>>> +                           ILCLIENT_DISABLE_ALL_PORTS |
> >>>> +                           ILCLIENT_ENABLE_INPUT_BUFFERS |
> >>>> +                           ILCLIENT_ENABLE_OUTPUT_BUFFERS);
> >>>
> >>> Tabs should be converted to spaces. There are many instances of tabs
> >>> being used in this patch.
> >>>
> >>> Others will have to provide a more technical review (not to mention
> >>> possible additions docs, Changelog, MAINTAINERS, and
> >>> libavcodec/version.h).
> >>> _______________________________________________
> >>> ffmpeg-devel mailing list
> >>> ffmpeg-devel at ffmpeg.org
> >>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >>
> >
>
> Any thoughts on how we may proceed forward?
>
> Thank You,
> Amancio
>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list