[FFmpeg-devel] [Patch] mpegts: emit pes packets on completion

Janne Grunau janne-ffmpeg
Thu Apr 29 01:45:16 CEST 2010


On Sat, Apr 24, 2010 at 12:13:49AM +0200, Janne Grunau wrote:
> Hi,
> 
> the mpegts demuxer emits pes packets only after the start of the next
> packet. This creates problems for streams with distant and rare packets
> like DVB subtitles.
> The attached patch emits pes packets as soon as the data is completely
> written.
> 
> Janne

> diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
> index d594abc..006d640 100644
> --- a/libavformat/mpegts.c
> +++ b/libavformat/mpegts.c
> @@ -807,6 +807,13 @@ static int mpegts_push_data(MpegTSFilter *filter,
>                  pes->data_index += buf_size;
>              }
>              buf_size = 0;
> +            /* emit complete packets
> +             * total_size is the number of bytes following pes_packet_length
> +             * in the pes header, i.e. not counting the first 6 bytes */
> +            if (pes->pes_header_size + pes->data_index >= pes->total_size + 6) {

the condition needs to be == and it probably makes sense to check for
pes packets with known packet size, i.e. total_size < MAX_PES_PAYLOADSIZE

updated patch attached

Janne

-------------- next part --------------
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index c92a9c2..c002a3f 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -807,6 +807,14 @@ static int mpegts_push_data(MpegTSFilter *filter,
                 pes->data_index += buf_size;
             }
             buf_size = 0;
+            /* emit complete packets with known packet size
+             * total_size is the number of bytes following pes_packet_length
+             * in the pes header, i.e. not counting the first 6 bytes */
+            if (pes->total_size < MAX_PES_PAYLOAD &&
+                pes->pes_header_size + pes->data_index == pes->total_size + 6) {
+                ts->stop_parse = 1;
+                new_pes_packet(pes, ts->pkt);
+            }
             break;
         case MPEGTS_SKIP:
             buf_size = 0;



More information about the ffmpeg-devel mailing list