title: Understanding PTS and DTS in video frames
body: <p>I had fps issues when transcoding from avi to mp4(x264). Eventually the problem was in PTS and DTS values, so lines 12-15 where added before av_interleaved_write_frame function:</p>
  
  <pre><code>1.  AVFormatContext* outContainer = NULL;
  2.  avformat_alloc_output_context2(&amp;outContainer, NULL, "mp4", "c:\\test.mp4";
  3.  AVCodec *encoder = avcodec_find_encoder(AV_CODEC_ID_H264);
  4.  AVStream *outStream = avformat_new_stream(outContainer, encoder);
  5.  // outStream-&gt;codec initiation
  6.  // ...
  7.  avformat_write_header(outContainer, NULL);
  
  8.  // reading and decoding packet
  9.  // ...
  10. avcodec_encode_video2(outStream-&gt;codec, &amp;encodedPacket, decodedFrame, &amp;got_frame)
  11. 
  12. if (encodedPacket.pts != AV_NOPTS_VALUE)
  13.     encodedPacket.pts =  av_rescale_q(encodedPacket.pts, outStream-&gt;codec-&gt;time_base, outStream-&gt;time_base);
  14. if (encodedPacket.dts != AV_NOPTS_VALUE)
  15.     encodedPacket.dts = av_rescale_q(encodedPacket.dts, outStream-&gt;codec-&gt;time_base, outStream-&gt;time_base);
  16. 
  17. av_interleaved_write_frame(outContainer, &amp;encodedPacket)
  </code></pre>
  
  <p>After reading many posts I still do not understand:</p>
  
  <ol>
  <li><code>outStream-&gt;codec-&gt;time_base</code> = 1/25 and <code>outStream-&gt;time_base</code> = 1/12800. The 1st one was set by me but I cannot figure out why and who set 12800? I noticed that before line (7) <code>outStream-&gt;time_base</code> = 1/90000 and right after it it changes to 1/12800, why?
  When I transcode from avi to avi, meaning changing the line (2) to <code>avformat_alloc_output_context2(&amp;outContainer, NULL, "avi", "c:\\test.avi";</code> , so before and after line (7) <code>outStream-&gt;time_base</code> remains always 1/25 and not like in mp4 case, why?</li>
  <li>What is the difference between time_base of <code>outStream-&gt;codec</code> and <code>outStream</code>?</li>
  <li>To calc the pts <code>av_rescale_q</code> does: takes 2 time_base, multiplies their fractions in cross and then compute the pts. Why it does this in this way? As I debugged, the <code>encodedPacket.pts</code> has value incremental by 1, so why changing it if it does has value?</li>
  <li>At the beginning the dts value is -2 and after each rescaling it still has negative number, but despite this the video played correctly! Shouldn't it be positive?</li>
  </ol>