[FFmpeg-devel] [PATCH] lavf: split packets before muxing.
Clément Bœsch
ubitux at gmail.com
Fri Dec 7 03:21:02 CET 2012
On Thu, Dec 06, 2012 at 01:51:36PM +0100, Nicolas George wrote:
> Le sextidi 16 frimaire, an CCXXI, Clément Bœsch a écrit :
> > New version merging the side data back after muxing.
>
> Sorry to take the train already rolling (av_packet_*_side_data() are
> undocumented): would it not be simpler to copy the packet structure and
> adjust the size / split the side data in the copy?
>
> I find that schemes like "do X; something; undo X" are usually a bad idea.
>
So something like attached instead?
[...]
--
Clément B.
-------------- next part --------------
From 8de676cadfdd2cf186d02f83b4decddbec021d8f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20B=C5=93sch?= <ubitux at gmail.com>
Date: Mon, 3 Dec 2012 23:13:53 +0100
Subject: [PATCH] lavf: split packets before muxing.
After demuxing, data and side are merged. Before decoding, they are
split. Encoder will perform with data and side split. This means that a
muxer can receive split data (after encoding) but also merged data (if
called directly after demuxing). This commit makes sure data and side
are split for the muxer.
---
libavformat/mux.c | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/libavformat/mux.c b/libavformat/mux.c
index 9bcee99..f7bb3ad 100644
--- a/libavformat/mux.c
+++ b/libavformat/mux.c
@@ -484,13 +484,25 @@ static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt)
return 0;
}
+static inline int split_write_packet(AVFormatContext *s, AVPacket *pkt)
+{
+ int ret;
+ AVPacket spkt = *pkt;
+
+ av_packet_split_side_data(&spkt);
+ ret = s->oformat->write_packet(s, &spkt);
+ spkt.data = NULL;
+ av_destruct_packet(&spkt);
+ return ret;
+}
+
int av_write_frame(AVFormatContext *s, AVPacket *pkt)
{
int ret;
if (!pkt) {
if (s->oformat->flags & AVFMT_ALLOW_FLUSH) {
- ret = s->oformat->write_packet(s, pkt);
+ ret = s->oformat->write_packet(s, NULL);
if (ret >= 0 && s->pb && s->pb->error < 0)
ret = s->pb->error;
return ret;
@@ -503,7 +515,7 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt)
if (ret < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
return ret;
- ret = s->oformat->write_packet(s, pkt);
+ ret = split_write_packet(s, pkt);
if (ret >= 0 && s->pb && s->pb->error < 0)
ret = s->pb->error;
@@ -733,7 +745,7 @@ int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt)
if (ret <= 0) //FIXME cleanup needed for ret<0 ?
return ret;
- ret = s->oformat->write_packet(s, &opkt);
+ ret = split_write_packet(s, &opkt);
if (ret >= 0)
s->streams[opkt.stream_index]->nb_frames++;
@@ -759,7 +771,7 @@ int av_write_trailer(AVFormatContext *s)
if (!ret)
break;
- ret = s->oformat->write_packet(s, &pkt);
+ ret = split_write_packet(s, &pkt);
if (ret >= 0)
s->streams[pkt.stream_index]->nb_frames++;
--
1.8.0.1
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20121207/2c8a4c36/attachment.asc>
More information about the ffmpeg-devel
mailing list