mpegtsenc: allow user triggered PES packet flushing
Signed-off-by: Jindrich Makovicka <jindrich.makovicka@nangu.tv> Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
parent
9c47f2b294
commit
3fadb29baf
@ -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)
|
|||||||
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 = {
|
|||||||
.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,
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user