mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
make av_interleaved_write_frame() flush packets when pkt is NULL
This patch allows the user to force flushing of all queued packets by calling av_interleaved_write_frame() with pkt set to NULL. Signed-off-by: Jindrich Makovicka <jindrich.makovicka@nangu.tv> Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
parent
c9024a9fd7
commit
904100e5fc
@ -1436,6 +1436,8 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt);
|
|||||||
* @param s media file handle
|
* @param s media file handle
|
||||||
* @param pkt The packet containing the data to be written. Libavformat takes
|
* @param pkt The packet containing the data to be written. Libavformat takes
|
||||||
* ownership of the data and will free it when it sees fit using the packet's
|
* ownership of the data and will free it when it sees fit using the packet's
|
||||||
|
* This can be NULL (at any time, not just at the end), to flush the
|
||||||
|
* interleaving queues.
|
||||||
* @ref AVPacket.destruct "destruct" field. The caller must not access the data
|
* @ref AVPacket.destruct "destruct" field. The caller must not access the data
|
||||||
* after this function returns, as it may already be freed.
|
* after this function returns, as it may already be freed.
|
||||||
* Packet's @ref AVPacket.stream_index "stream_index" field must be set to the
|
* Packet's @ref AVPacket.stream_index "stream_index" field must be set to the
|
||||||
|
@ -3128,24 +3128,30 @@ static int interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, in
|
|||||||
}
|
}
|
||||||
|
|
||||||
int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
|
int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
|
||||||
AVStream *st= s->streams[ pkt->stream_index];
|
int ret, flush = 0;
|
||||||
int ret;
|
|
||||||
|
|
||||||
//FIXME/XXX/HACK drop zero sized packets
|
if (pkt) {
|
||||||
if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
|
AVStream *st= s->streams[ pkt->stream_index];
|
||||||
return 0;
|
|
||||||
|
|
||||||
av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
|
//FIXME/XXX/HACK drop zero sized packets
|
||||||
pkt->size, pkt->dts, pkt->pts);
|
if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
|
||||||
if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
|
return 0;
|
||||||
return ret;
|
|
||||||
|
|
||||||
if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
|
av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
|
||||||
return AVERROR(EINVAL);
|
pkt->size, pkt->dts, pkt->pts);
|
||||||
|
if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
} else {
|
||||||
|
av_dlog(s, "av_interleaved_write_frame FLUSH\n");
|
||||||
|
flush = 1;
|
||||||
|
}
|
||||||
|
|
||||||
for(;;){
|
for(;;){
|
||||||
AVPacket opkt;
|
AVPacket opkt;
|
||||||
int ret= interleave_packet(s, &opkt, pkt, 0);
|
int ret= interleave_packet(s, &opkt, pkt, flush);
|
||||||
if(ret<=0) //FIXME cleanup needed for ret<0 ?
|
if(ret<=0) //FIXME cleanup needed for ret<0 ?
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user