Commit 3fadb29b authored by Jindrich Makovicka's avatar Jindrich Makovicka Committed by Martin Storsjö

mpegtsenc: allow user triggered PES packet flushing

Signed-off-by: 's avatarJindrich Makovicka <jindrich.makovicka@nangu.tv>
Signed-off-by: 's avatarMartin Storsjö <martin@martin.st>
parent 9c47f2b2
...@@ -935,7 +935,7 @@ static void mpegts_write_pes(AVFormatContext *s, AVStream *st, ...@@ -935,7 +935,7 @@ static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
avio_flush(s->pb); avio_flush(s->pb);
} }
static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt) static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
{ {
AVStream *st = s->streams[pkt->stream_index]; AVStream *st = s->streams[pkt->stream_index];
int size = pkt->size; int size = pkt->size;
...@@ -1059,27 +1059,48 @@ static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -1059,27 +1059,48 @@ static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt)
return 0; return 0;
} }
static int mpegts_write_end(AVFormatContext *s) static void mpegts_write_flush(AVFormatContext *s)
{ {
MpegTSWrite *ts = s->priv_data;
MpegTSWriteStream *ts_st;
MpegTSService *service;
AVStream *st;
int i; int i;
/* flush current packets */ /* flush current packets */
for(i = 0; i < s->nb_streams; i++) { for(i = 0; i < s->nb_streams; i++) {
st = s->streams[i]; AVStream *st = s->streams[i];
ts_st = st->priv_data; MpegTSWriteStream *ts_st = st->priv_data;
if (ts_st->payload_size > 0) { if (ts_st->payload_size > 0) {
mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size, mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
ts_st->payload_pts, ts_st->payload_dts, ts_st->payload_pts, ts_st->payload_dts,
ts_st->payload_flags & AV_PKT_FLAG_KEY); ts_st->payload_flags & AV_PKT_FLAG_KEY);
ts_st->payload_size = 0;
} }
}
avio_flush(s->pb);
}
static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt)
{
if (!pkt) {
mpegts_write_flush(s);
return 1;
} else {
return mpegts_write_packet_internal(s, pkt);
}
}
static int mpegts_write_end(AVFormatContext *s)
{
MpegTSWrite *ts = s->priv_data;
MpegTSService *service;
int i;
mpegts_write_flush(s);
for(i = 0; i < s->nb_streams; i++) {
AVStream *st = s->streams[i];
MpegTSWriteStream *ts_st = st->priv_data;
av_freep(&ts_st->payload); av_freep(&ts_st->payload);
av_freep(&ts_st->adts); av_freep(&ts_st->adts);
} }
avio_flush(s->pb);
for(i = 0; i < ts->nb_services; i++) { for(i = 0; i < ts->nb_services; i++) {
service = ts->services[i]; service = ts->services[i];
...@@ -1103,5 +1124,6 @@ AVOutputFormat ff_mpegts_muxer = { ...@@ -1103,5 +1124,6 @@ AVOutputFormat ff_mpegts_muxer = {
.write_header = mpegts_write_header, .write_header = mpegts_write_header,
.write_packet = mpegts_write_packet, .write_packet = mpegts_write_packet,
.write_trailer = mpegts_write_end, .write_trailer = mpegts_write_end,
.flags = AVFMT_ALLOW_FLUSH,
.priv_class = &mpegts_muxer_class, .priv_class = &mpegts_muxer_class,
}; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment