[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