diff -ur ff_pes_cal_header_1/mpegenc.c 4.3/mpegenc.c
--- ff_pes_cal_header_1/mpegenc.c	2008-04-02 22:22:42.000000000 +0800
+++ 4.3/mpegenc.c	2008-04-04 01:30:53.000000000 +0800
@@ -1011,46 +1011,8 @@
 static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
 {
     MpegMuxContext *s = ctx->priv_data;
-    int stream_index= pkt->stream_index;
-    int size= pkt->size;
-    uint8_t *buf= pkt->data;
-    AVStream *st = ctx->streams[stream_index];
-    PESStream *stream = st->priv_data;
-    int64_t pts, dts;
-    PacketDesc *pkt_desc;
-    const int preload= av_rescale(ctx->preload, 90000, AV_TIME_BASE);
-    const int is_iframe = st->codec->codec_type == CODEC_TYPE_VIDEO && (pkt->flags & PKT_FLAG_KEY);
-
-    pts= pkt->pts;
-    dts= pkt->dts;
-
-    if(pts != AV_NOPTS_VALUE) pts += preload;
-    if(dts != AV_NOPTS_VALUE) dts += preload;
-
-//av_log(ctx, AV_LOG_DEBUG, "dts:%f pts:%f flags:%d stream:%d nopts:%d\n", dts/90000.0, pts/90000.0, pkt->flags, pkt->stream_index, pts != AV_NOPTS_VALUE);
-    if (!stream->premux_packet)
-        stream->next_packet = &stream->premux_packet;
-    *stream->next_packet=
-    pkt_desc= av_mallocz(sizeof(PacketDesc));
-    pkt_desc->pts= pts;
-    pkt_desc->dts= dts;
-    pkt_desc->unwritten_size=
-    pkt_desc->size= size;
-    if(!stream->predecode_packet)
-        stream->predecode_packet= pkt_desc;
-    stream->next_packet= &pkt_desc->next;
-
-    av_fifo_realloc(&stream->fifo, av_fifo_size(&stream->fifo) + size + 1);
-
-    if (s->is_dvd){
-        if (is_iframe && (s->packet_number == 0 || (pts - stream->vobu_start_pts >= 36000))) { // min VOBU length 0.4 seconds (mpucoder)
-            stream->bytes_to_iframe = av_fifo_size(&stream->fifo);
-            stream->align_iframe = 1;
-            stream->vobu_start_pts = pts;
-        }
-    }
-
-    av_fifo_write(&stream->fifo, buf, size);
+    int packet_number = s->packet_number;
+    ff_pes_write_packet(ctx,pkt,&packet_number);
 
     for(;;){
         int ret= output_packet(ctx, 0);
diff -ur ff_pes_cal_header_1/mpegpesenc.c 4.3/mpegpesenc.c
--- ff_pes_cal_header_1/mpegpesenc.c	2008-04-03 21:32:51.000000000 +0800
+++ 4.3/mpegpesenc.c	2008-04-04 01:41:44.000000000 +0800
@@ -37,6 +37,7 @@
     for(i=0;i<ctx->nb_streams;i++) {
         st = ctx->streams[i];
         stream = st->priv_data;
+        stream->format = PES_FMT_TS;/* just initial for TS */
         av_set_pts_info(st, 64, 1, 90000);
 
         switch(st->codec->codec_type) {
@@ -397,9 +398,10 @@
  * Write packet into PES FIFO.
  * @param [in] ctx  the AVFormatContext which contains streams.
  * @param [in] pkt  the packet to write.
+ * @param [in] the pointer point to variable in PS struct
  * @return  NULL
  */
-void ff_pes_write_packet(AVFormatContext *ctx, AVPacket *pkt)
+void ff_pes_write_packet(AVFormatContext *ctx, AVPacket *pkt, int *packet_number)
 {
     int stream_index= pkt->stream_index;
     int size= pkt->size;
@@ -409,6 +411,7 @@
     int64_t pts, dts;
     PacketDesc *pkt_desc;
     const int preload= av_rescale(ctx->preload, 90000, AV_TIME_BASE);
+    const int is_iframe = st->codec->codec_type == CODEC_TYPE_VIDEO && (pkt->flags & PKT_FLAG_KEY);
 
     pts= pkt->pts;
     dts= pkt->dts;
@@ -430,6 +433,13 @@
     stream->next_packet= &pkt_desc->next;
 
     av_fifo_realloc(&stream->fifo, av_fifo_size(&stream->fifo) + size + 1);
+    if (stream->format == PES_FMT_DVD){
+        if (is_iframe && (*packet_number == 0 || (pts - stream->vobu_start_pts >= 36000))) { // min VOBU length 0.4 seconds (mpucoder)
+            stream->bytes_to_iframe = av_fifo_size(&stream->fifo);
+            stream->align_iframe = 1;
+            stream->vobu_start_pts = pts;
+        }
+    }
     av_fifo_write(&stream->fifo, buf, size);
 }
 
diff -ur ff_pes_cal_header_1/mpegpes.h 4.3/mpegpes.h
--- ff_pes_cal_header_1/mpegpes.h	2008-04-02 01:03:18.000000000 +0800
+++ 4.3/mpegpes.h	2008-04-04 01:31:12.000000000 +0800
@@ -101,9 +101,10 @@
  * Write packet into PES FIFO.
  * @param [in] ctx  the AVFormatContext which contains streams.
  * @param [in] pkt  the packet to write.
+ * @param [in] the pointer point to variable in PS struct
  * @return  NULL
  */
-void ff_pes_write_packet(AVFormatContext *ctx, AVPacket *pkt);
+void ff_pes_write_packet(AVFormatContext *ctx, AVPacket *pkt, int *packet_number);
 
 /**
  * Find the stream to mux into the PES stream.
diff -ur ff_pes_cal_header_1/mpegtsenc.c 4.3/mpegtsenc.c
--- ff_pes_cal_header_1/mpegtsenc.c	2008-03-31 22:49:48.000000000 +0800
+++ 4.3/mpegtsenc.c	2008-04-04 01:30:58.000000000 +0800
@@ -630,7 +630,6 @@
     int general_pack = 0;  /*"general" pack without data specific to one stream?*/
     int pes_size;
     uint8_t* q = stream->payload;
-    pes_stream->format = PES_FMT_TS;
 
     id = stream->id;
     packet_size = s->packet_size;
@@ -724,7 +723,8 @@
 
 static int mpegts_write_packet(AVFormatContext *ctx, AVPacket *pkt)
 {
-    ff_pes_write_packet(ctx, pkt);
+    int packet_number = 0;/* just a stuff param for function call */
+    ff_pes_write_packet(ctx, pkt,&packet_number);
     for(;;){
         int ret = output_packet(ctx, 0);
         if(ret<=0)
Only in ff_pes_cal_header_1/: readme
