|
|
|
@ -935,7 +935,7 @@ static void mpegts_write_pes(AVFormatContext *s, AVStream *st, |
|
|
|
|
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]; |
|
|
|
|
int size = pkt->size; |
|
|
|
@ -1059,27 +1059,48 @@ static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
|
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; |
|
|
|
|
|
|
|
|
|
/* flush current packets */ |
|
|
|
|
for(i = 0; i < s->nb_streams; i++) { |
|
|
|
|
st = s->streams[i]; |
|
|
|
|
ts_st = st->priv_data; |
|
|
|
|
AVStream *st = s->streams[i]; |
|
|
|
|
MpegTSWriteStream *ts_st = st->priv_data; |
|
|
|
|
if (ts_st->payload_size > 0) { |
|
|
|
|
mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size, |
|
|
|
|
ts_st->payload_pts, ts_st->payload_dts, |
|
|
|
|
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->adts); |
|
|
|
|
} |
|
|
|
|
avio_flush(s->pb); |
|
|
|
|
|
|
|
|
|
for(i = 0; i < ts->nb_services; i++) { |
|
|
|
|
service = ts->services[i]; |
|
|
|
@ -1103,5 +1124,6 @@ AVOutputFormat ff_mpegts_muxer = { |
|
|
|
|
.write_header = mpegts_write_header, |
|
|
|
|
.write_packet = mpegts_write_packet, |
|
|
|
|
.write_trailer = mpegts_write_end, |
|
|
|
|
.flags = AVFMT_ALLOW_FLUSH, |
|
|
|
|
.priv_class = &mpegts_muxer_class, |
|
|
|
|
}; |
|
|
|
|