[FFmpeg-devel] [RFC/PATCH] Pass PRIVATE_STREAM_2 MPEG-PS packets to caller

Richard peper03 at yahoo.com
Sun Mar 3 00:51:46 CET 2013


On 02/03/13 13:18, Michael Niedermayer wrote:
> On Tue, Feb 26, 2013 at 05:45:23PM +0100, Richard wrote:
>> On 25/02/13 17:23, Richard wrote:
>>>
>>> If you are ok with my suggestions above, I'll create a new patch to
>>> parse and merge the packets, setting the fields as required.
>>
>> Assuming no reply is an 'ok', I've attached a new patch.  This patch
>> only passes the two packets as used on DVDs with the codec
>> AV_CODEC_ID_DVD_NAV.  The packets are combined and the pts and
>> duration fields of the AVPacket are set based on the contents of the
>> PCI packet.
>>
>> Richard.
>>
>
>>   configure                   |    2 -
>>   libavcodec/Makefile         |    1
>>   libavcodec/allcodecs.c      |    1
>>   libavcodec/avcodec.h        |    2 +
>>   libavcodec/codec_desc.c     |    6 +++
>>   libavcodec/dvd_nav_parser.c |   85 ++++++++++++++++++++++++++++++++++++++++++++
>>   libavcodec/version.h        |    2 -
>>   libavformat/mpeg.c          |   28 +++++++++++---
>>   8 files changed, 120 insertions(+), 7 deletions(-)
>> cd59250a2af4984fb9353db52f3b314dbc95d357  0001-Add-passing-DVD-navigation-packets-startcode-0x1bf-t.patch
>>  From eea790f8175403703be1559f8d725140ca3987bd Mon Sep 17 00:00:00 2001
>> From: Richard <peper03 at yahoo.com>
>> Date: Tue, 26 Feb 2013 17:31:42 +0100
>> Subject: [PATCH] Add passing DVD navigation packets (startcode 0x1bf) to
>>   caller to allow better playback handling of DVDs.  The two
>>   types of packets (PCI and DSI) are passed untouched but
>>   combined by the new codec ID AV_CODEC_ID_DVD_NAV.  The
>>   first 980 bytes in the packet contain the PCI data.  The
>>   next 1018 are the DSI data.
>>
>> ---
>>   configure                   |    2 +-
>>   libavcodec/Makefile         |    1 +
>>   libavcodec/allcodecs.c      |    1 +
>>   libavcodec/avcodec.h        |    2 +
>>   libavcodec/codec_desc.c     |    6 +++
>>   libavcodec/dvd_nav_parser.c |   85 +++++++++++++++++++++++++++++++++++++++++++
>>   libavcodec/version.h        |    2 +-
>>   libavformat/mpeg.c          |   28 +++++++++++---
>>   8 files changed, 120 insertions(+), 7 deletions(-)
>>   create mode 100644 libavcodec/dvd_nav_parser.c
>>
>> diff --git a/configure b/configure
>> index f442715..52c3078 100755
>> --- a/configure
>> +++ b/configure
>> @@ -1869,7 +1869,7 @@ wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel"
>>   # parsers
>>   h264_parser_select="error_resilience golomb h264chroma h264dsp h264pred h264qpel mpegvideo videodsp"
>>   mpeg4video_parser_select="error_resilience mpegvideo"
>> -mpegvideo_parser_select="error_resilience mpegvideo"
>> +mpegvideo_parser_select="error_resilience mpegvideo dvdnav"
>>   vc1_parser_select="error_resilience mpegvideo"
>
> this looks wrong, maybe you meant dvdnav_parser but either way make
> sure the dependancies have been tested if you are unsure if they are
> correct
>
> also dont mix dvdnav and dvd_nav it will not work
>
>
>>
>>   # external libraries
>> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
>> index 52282e3..3b8b277 100644
>> --- a/libavcodec/Makefile
>> +++ b/libavcodec/Makefile
>> @@ -741,6 +741,7 @@ OBJS-$(CONFIG_PNG_PARSER)              += png_parser.o
>>   OBJS-$(CONFIG_MPEGAUDIO_PARSER)        += mpegaudio_parser.o \
>>                                             mpegaudiodecheader.o mpegaudiodata.o
>>   OBJS-$(CONFIG_MPEGVIDEO_PARSER)        += mpegvideo_parser.o    \
>> +                                          dvd_nav_parser.o \
>>                                             mpeg12.o mpeg12data.o
>>   OBJS-$(CONFIG_PNM_PARSER)              += pnm_parser.o pnm.o
>>   OBJS-$(CONFIG_RV30_PARSER)             += rv34_parser.o
>> diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
>> index 584446f..1eaf2d3 100644
>> --- a/libavcodec/allcodecs.c
>> +++ b/libavcodec/allcodecs.c
>> @@ -515,6 +515,7 @@ void avcodec_register_all(void)
>>       REGISTER_PARSER(DNXHD,              dnxhd);
>>       REGISTER_PARSER(DVBSUB,             dvbsub);
>>       REGISTER_PARSER(DVDSUB,             dvdsub);
>> +    REGISTER_PARSER(DVD_NAV,            dvd_nav);
>>       REGISTER_PARSER(FLAC,               flac);
>>       REGISTER_PARSER(GSM,                gsm);
>>       REGISTER_PARSER(H261,               h261);
>> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
>> index f809e3d..1e08271 100644
>> --- a/libavcodec/avcodec.h
>> +++ b/libavcodec/avcodec.h
>> @@ -483,6 +483,8 @@ enum AVCodecID {
>>       AV_CODEC_ID_IDF        = MKBETAG( 0 ,'I','D','F'),
>>       AV_CODEC_ID_OTF        = MKBETAG( 0 ,'O','T','F'),
>>       AV_CODEC_ID_SMPTE_KLV  = MKBETAG('K','L','V','A'),
>> +    AV_CODEC_ID_DVD_NAV    = MKBETAG('D','N','A','V'),
>> +
>>
>>       AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it
>>
>> diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c
>> index 440e9d9..32db185 100644
>> --- a/libavcodec/codec_desc.c
>> +++ b/libavcodec/codec_desc.c
>> @@ -2523,6 +2523,12 @@ static const AVCodecDescriptor codec_descriptors[] = {
>>           .name      = "klv",
>>           .long_name = NULL_IF_CONFIG_SMALL("SMPTE 336M Key-Length-Value (KLV) metadata"),
>>       },
>> +    {
>> +        .id        = AV_CODEC_ID_DVD_NAV,
>> +        .type      = AVMEDIA_TYPE_DATA,
>> +        .name      = "dvd_nav_packet",
>> +        .long_name = NULL_IF_CONFIG_SMALL("DVD Nav packet"),
>> +    },
>>
>>   };
>>
>> diff --git a/libavcodec/dvd_nav_parser.c b/libavcodec/dvd_nav_parser.c
>> new file mode 100644
>> index 0000000..21deb45
>> --- /dev/null
>> +++ b/libavcodec/dvd_nav_parser.c
>> @@ -0,0 +1,85 @@
>> +/*
>> + * DVD navigation block parser for FFmpeg
>> + * Copyright (c) 2013 The ffmpeg Project
>> + *
>> + * 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 "avcodec.h"
>> +#include "dsputil.h"
>> +#include "get_bits.h"
>> +#include "parser.h"
>> +
>> +/* parser definition */
>> +typedef struct DVDNavParseContext {
>> +    ParseContext pc;
>> +} DVDNavParseContext;
>> +
>> +static int dvd_nav_parse(AVCodecParserContext *s,
>> +                         AVCodecContext *avctx,
>> +                         const uint8_t **poutbuf, int *poutbuf_size,
>> +                         const uint8_t *buf, int buf_size)
>> +{
>> +    DVDNavParseContext *pc1 = s->priv_data;
>> +    ParseContext *pc= &pc1->pc;
>> +    int next = END_NOT_FOUND;
>> +    int blockOK = 1;
>> +
>> +    s->pict_type = AV_PICTURE_TYPE_NONE;
>> +
>> +    avctx->time_base.num = 1;
>> +    avctx->time_base.den = 90000;
>> +
>> +    switch(buf[0])
>> +    {
>> +        case 0x00:
>> +        {
>> +            /* PCI */
>> +            uint32_t startpts = AV_RB32(&buf[0x0D]);
>> +            uint32_t endpts = AV_RB32(&buf[0x11]);
>
> possible out of array accesses
>
>
>> +            s->pts = (int64_t)startpts;
>> +            s->duration = endpts - startpts;
>
> missing validity checks
>
> [...]

Ok, here's another attempt.  I removed the change to configure as the 
new parser doesn't actually have any dependencies and nothing is 
dependent on it.  Additionally, I added more checks to dvd_nav_parser.c 
to check size, order etc. and added a fixed array to replace the use of 
ff_combine_frame.

Richard.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Add-passing-DVD-navigation-packets-startcode-0x1bf-t.patch
Type: text/x-patch
Size: 10385 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20130303/8adf8850/attachment.bin>


More information about the ffmpeg-devel mailing list