[FFmpeg-devel] [PATCH] avformat: add TiVo ty demuxer
Michael Niedermayer
michael at niedermayer.cc
Thu Nov 2 04:15:26 EET 2017
On Wed, Nov 01, 2017 at 02:40:27PM +0100, Paul B Mahol wrote:
> Signed-off-by: Paul B Mahol <onemda at gmail.com>
> ---
> libavformat/Makefile | 1 +
> libavformat/allformats.c | 1 +
> libavformat/ty.c | 775 +++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 777 insertions(+)
> create mode 100644 libavformat/ty.c
[...]
> +static int64_t get_pts(const uint8_t *buf)
> +{
> + int a = buf[0] & 0xe >> 1;
> + int b = AV_RB16(buf + 1);
> + int c = AV_RB16(buf + 3);
> +
> + if (!(1 & a & b & c))
> + return AV_NOPTS_VALUE;
> +
> + a >>= 1;
> + b >>= 1;
> + c >>= 1;
> + return (((uint64_t)a) << 30) | (b << 15) | c;
> +}
duplicate of ff_parse_pes_pts()
i didnt check most of the code but seeing this, i wonder how much
more mpeg demuxing this duplicates ?
> +
> +static int DemuxRecVideo(AVFormatContext *s, TyRecHdr *rec_hdr, AVPacket *pkt)
> +{
> + TYDemuxContext *ty = s->priv_data;
> + AVIOContext *pb = s->pb;
> + const int subrec_type = rec_hdr->subrec_type;
> + const int64_t rec_size = rec_hdr->rec_size;
> + int esOffset1;
> + int got_packet = 0;
> +
> + avio_read(pb, ty->chunk, 32);
> + avio_seek(pb, -32, SEEK_CUR);
> +
> + if (subrec_type != 0x02 && subrec_type != 0x0c &&
> + subrec_type != 0x08 && rec_size > 4) {
> + /* get the PTS from this packet if it has one.
> + * on S1, only 0x06 has PES. On S2, however, most all do.
> + * Do NOT Pass the PES Header to the MPEG2 codec */
> + esOffset1 = find_es_header(ty_VideoPacket, ty->chunk, 5);
> + if (esOffset1 != -1) {
> + ty->last_video_pts = get_pts(
> + &ty->chunk[ esOffset1 + VIDEO_PTS_OFFSET ] );
> + if (subrec_type != 0x06) {
> + /* if we found a PES, and it's not type 6, then we're S2 */
> + /* The packet will have video data (& other headers) so we
> + * chop out the PES header and send the rest */
> + if (rec_size >= VIDEO_PES_LENGTH + esOffset1) {
> + int size = rec_hdr->rec_size - VIDEO_PES_LENGTH - esOffset1;
> + avio_skip(pb, VIDEO_PES_LENGTH + esOffset1);
> + av_get_packet(pb, pkt, size);
this and other av_get_packet() calls lack error handling
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Complexity theory is the science of finding the exact solution to an
approximation. Benchmarking OTOH is finding an approximation of the exact
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20171102/4f157748/attachment.sig>
More information about the ffmpeg-devel
mailing list