Thank you.

That solved the problem.

Thanks again for all helps.

-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of Kulti
Sent: 30/09/2010 8:16 PM
To: Libav* user questions and discussions
Subject: Re: [libav-user] non monotone timestamps

On Thu, Sep 30, 2010 at 6:33 PM, Linux V <[email protected]> wrote:

> I am trying to encode a wma stream which is downloaded via libmms to mp3.
>
>
>
> I am getting this error when I try to write frame
>
>
>
> error, non monotone timestamps 4887518128590291004 >= 7216676395666
>
> error, non monotone timestamps 4846352658059493436 >= 7216677804686
>
> error, non monotone timestamps 4859273513118728252 >= 7216678673811
>
> error, non monotone timestamps 4886046458046316604 >= 7216680462839
>
>
>
> and many more repeating.
>
>
>
> Can anyone guide me what is causing this ?
>
>
>
> Thanks in advance
>
>
>
> Here is my program
>
>
>
> #include <stdio.h>
>
> #include "libmms/mmsx.h"
>
> #include "libmms/mms.h"
>
> #include "libavcodec/avcodec.h"
>
> #include "libavformat/avformat.h"
>
> #include "libavutil/fifo.h"
>
>
>
> #define MAX_AUDIO_PACKET_SIZE (4 * 2048)
>
> const char *url = "mms://live.cumulusstreaming.com/KPLX-FM";
>
>
>
> typedef struct PacketQueue {
>
>  AVPacketList *first_pkt, *last_pkt;
>
>  int nb_packets;
>
>  int size;
>
> } PacketQueue;
>
>
>
> PacketQueue audioq;
>
>
>
> void packet_queue_init(PacketQueue *q) {
>
>  memset(q, 0, sizeof(PacketQueue));
>
> }
>
> int packet_queue_put(PacketQueue *q, AVPacket *pkt) {
>
>
>
>  AVPacketList *pkt1;
>
>  if(av_dup_packet(pkt) < 0) {
>
>    return -1;
>
>  }
>
>  pkt1 = av_malloc(sizeof(AVPacketList));
>
>  if (!pkt1)
>
>    return -1;
>
>  pkt1->pkt = *pkt;
>
>  pkt1->next = NULL;
>
>
>
>  if (!q->last_pkt)
>
>    q->first_pkt = pkt1;
>
>  else
>
>    q->last_pkt->next = pkt1;
>
>  q->last_pkt = pkt1;
>
>  q->nb_packets++;
>
>  q->size += pkt1->pkt.size;
>
>  return 0;
>
> }
>
> static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block)
>
> {
>
>  AVPacketList *pkt1;
>
>  int ret;
>
>
>
>  pkt1 = q->first_pkt;
>
>  if (pkt1)
>
>  {
>
>      q->first_pkt = pkt1->next;
>
>      if (!q->first_pkt)
>
>        q->last_pkt = NULL;
>
>      q->nb_packets--;
>
>      q->size -= pkt1->pkt.size;
>
>      *pkt = pkt1->pkt;
>
>      av_free(pkt1);
>
>      ret = 1;
>
>  }
>
>  else
>
>  {
>
>    ret = -1;
>
>  }
>
>  return ret;
>
> }
>
>
>
> void my_log_callback(void *ptr, int level, const char *fmt, va_list 
> vargs)
>
> {
>
>  printf(fmt, vargs);
>
> }
>
>
>
> int64_t seek_data(void *opaque, int64_t offset, int whence)
>
> {
>
>  printf("SEEK DATA\n");
>
>  return -1;
>
> }
>
>
>
> int main(int argc, char *argv[])
>
> {
>
>  mmsx_t *this = NULL;
>
>  mmsx_t *this2 = NULL;
>
>  char buf[2048];
>
>  char buf2[2048];
>
>  int i, res, audiostream;
>
>  FILE* f;
>
>  AVFormatContext* pFormatCtx;
>
>
>
>  av_log_set_callback(my_log_callback);
>
>  av_log_set_level(AV_LOG_VERBOSE);
>
>
>
>
>
>  av_register_all();
>
>
>
>  int read_data(void *opaque, char *buf, int buf_size);
>
>  static AVStream *add_audio_stream(AVFormatContext *oc, int codec_id, 
> AVCodecContext *pCodecCtx);
>
>
>
>  AVInputFormat* pAVInputFormat = av_find_input_format("asf");
>
>  if(!pAVInputFormat)
>
>  {
>
>    printf("Probe not successful\n");
>
>  }
>
>  else
>
>  {
>
>    printf("Probe successfull------%s-------%s\n",pAVInputFormat->name,
> pAVInputFormat->long_name);
>
>  }
>
>
>
>  if((this = mmsx_connect(NULL, NULL, url, 1)))
>
>    printf("Connect OK\n");
>
>
>
>  //pAVInputFormat->flags |= AVFMT_NOFILE;
>
>
>
>  ByteIOContext ByteIOCtx;
>
>  if(init_put_byte(&ByteIOCtx, buf, 2048, 0, this, read_data, NULL,
> seek_data) < 0)
>
>  {
>
>    printf("init_put_byte not successful\n");
>
>  }
>
>  ByteIOCtx.is_streamed = 1;
>
>
>
>
>
>  int ires = av_open_input_stream(&pFormatCtx, &ByteIOCtx, "", 
> pAVInputFormat,NULL);
>
>
>
>  if(ires < 0)
>
>  {
>
>    printf("Open input stream not successful %d\n",ires);
>
>  }
>
>  else
>
>  {
>
>    printf("Open input stream successfull %d\n",ires);
>
>  }
>
>
>
>  if(av_find_stream_info(pFormatCtx) < 0)
>
>  {
>
>     printf("Could not find stream information\n");
>
>  }
>
>  else
>
>  {
>
>    printf("Stream information found\n");
>
>  }
>
>
>
>  printf("Number of streams=%d\n",pFormatCtx->nb_streams);
>
>
>
>  audiostream = -1;
>
>  for(i=0; i<pFormatCtx->nb_streams; i++)
>
>  {
>
>    if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_AUDIO)
>
>    {
>
>      audiostream = i;
>
>      break;
>
>    }
>
>  }
>
>
>
>  if(audiostream == -1)
>
>  {
>
>    printf("No audio stream found in URL\n");
>
>    return -1;
>
>  }
>
>  else
>
>  {
>
>    printf("Audio stream found at - %d\n",audiostream);
>
>  }
>
>
>
>  AVCodecContext *pCodecCtx;
>
>  pCodecCtx = pFormatCtx->streams[audiostream]->codec;
>
>  AVCodec *pCodec;
>
>  pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
>
>  if(pCodec == NULL)
>
>  {
>
>    printf("Unsupported codec\n");
>
>  }
>
>  else
>
>  {
>
>    printf("Codec for stream  = %s\n", pCodec->name);
>
>  }
>
>
>
>  if(avcodec_open(pCodecCtx, pCodec) < 0)
>
>  {
>
>    printf("Open codec not successful\n");
>
>  }
>
>  else
>
>  {
>
>    printf("Open codec successful\n");
>
>  }
>
>
>
>
>
>
>
> ////OUTPUT FILE
>
>  AVOutputFormat *Outfmt;
>
>  AVFormatContext *oc;
>
>  AVStream *audio_st;
>
>  char *outfile = "output.mp3";
>
>  Outfmt = guess_format("mp3", NULL, NULL);
>
>  if(!Outfmt)
>
>  {
>
>    printf("Output format not guessed successful\n");
>
>  }
>
>  else
>
>  {
>
>    printf("Output format guessed
> successfully------%s-------%s\n",Outfmt->name, Outfmt->long_name);
>
>  }
>
>
>
>  oc = av_alloc_format_context();
>
>  if(!oc)
>
>  {
>
>    printf("Allocation of output media context not successful\n");
>
>  }
>
>  else
>
>  {
>
>    printf("Allocation of output media context successful\n");
>
>  }
>
>  oc->oformat = Outfmt;
>
>
>
>  if (av_set_parameters(oc, NULL) < 0)
>
>  {
>
>    printf("Invalid output format parameters\n");
>
>  }
>
>  else
>
>  {
>
>    printf("Output format parameters set successfully\n");
>
>  }
>
>  audio_st = add_audio_stream(oc, Outfmt->audio_codec, pCodecCtx);
>
>
>
>
>
>
>
>  AVCodecContext *outc;
>
>  AVCodec *outcodec;
>
>
>
>  outc = audio_st->codec;
>
>
>
>  outcodec = avcodec_find_encoder(outc->codec_id);
>
>
>
>  if(!outcodec)
>
>  {
>
>    printf("Could not find codec\n");
>
>  }
>
>  else
>
>  {
>
>    printf("Codec for out stream  = %s\n", outcodec->name);
>
>  }
>
>
>
>  if (avcodec_open(outc, outcodec) < 0)
>
>  {
>
>    printf("Could not open codec\n");
>
>  }
>
>  else
>
>  {
>
>    printf("Codec opened successfully\n");
>
>  }
>
>
>
>  if(!(Outfmt->flags & AVFMT_NOFILE))
>
>  {
>
>    if(url_fopen(&oc->pb, outfile, URL_WRONLY) < 0)
>
>    {
>
>      printf("Could not open %s\n",outfile);
>
>    }
>
>    else
>
>    {
>
>      printf("Output file opened successfully\n");
>
>    }
>
>  }
>
>
>
>  av_write_header(oc);
>
>
>
>
>
>  AVPacket pkt, packet;
>
>  av_init_packet(&pkt);
>
>  av_init_packet(&packet);
>
>
>
>
>
>  ReSampleContext *rs;
>
>
>
>  static short *samples= NULL;
>
>  short *mp3buffer = (short*) malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE);
>
>  uint8_t *outbuf = (uint8_t*) malloc(2*MAX_AUDIO_PACKET_SIZE);
>
>  uint8_t *data_buf = (uint8_t*)av_malloc(2*MAX_AUDIO_PACKET_SIZE);
>
>  uint8_t *audio_out = (uint8_t*)av_malloc(4*MAX_AUDIO_PACKET_SIZE);
>
>  uint8_t *buffer_resample = 
> (uint8_t*)av_malloc(2*MAX_AUDIO_PACKET_SIZE);
>
>
>
>  static unsigned int samples_size= 0;
>
>
>
>  if(pCodecCtx->sample_rate != outc->sample_rate || pCodecCtx->channels 
> !=
> outc->channels)
>
>      rs = audio_resample_init(outc->channels,pCodecCtx->channels,
> outc->sample_rate, pCodecCtx->sample_rate);
>
>
>
>  int finalPTS;
>
>
>
>  while(av_read_frame(pFormatCtx, &packet)>=0)
>
>  {
>
>    printf("Read FRAME\n");
>
>    fflush(stdin);
>
>    if(packet.stream_index==audiostream)
>
>    {
>
>      int bufSize = AVCODEC_MAX_AUDIO_FRAME_SIZE;
>
>      int result = avcodec_decode_audio2(pCodecCtx, mp3buffer, 
> &bufSize, packet.data, packet.size);
>
>      if(result > 0)
>
>      {
>
>        pkt.size= avcodec_encode_audio(outc, outbuf, 
> (2*MAX_AUDIO_PACKET_SIZE), mp3buffer);
>
>        pkt.pts = packet.pts;
>
>        pkt.data= outbuf;
>
>        if (av_interleaved_write_frame(oc, &pkt) != 0)
>
>        {
>
>          printf("Could not write audio frame\n");
>
>        }
>
>        else
>
>        {
>
>          printf("Audio frame written successfully\n");
>
>        }
>
>      }
>
>    }
>
>    av_free_packet(&packet);
>
>    av_free_packet(&pkt);
>
>  }
>
>  printf("END OF PROGRAM\n");
>
>
>
>
>
> }
>
>
>
> int read_data(void *opaque, char *buf, int buf_size)
>
> {
>
>  printf("Read DATA\n");
>
>  fflush(stdin);
>
>  mmsx_t *this22 = (mmsx_t *)opaque;
>
>  int cnt = mmsx_read(NULL, opaque, buf, buf_size);
>
>  return cnt;
>
> }
>
> static AVStream *add_audio_stream(AVFormatContext *oc, int codec_id, 
> AVCodecContext *pCodecCtx)
>
> {
>
>    AVCodecContext *c;
>
>    AVStream *st;
>
>
>
>    st = av_new_stream(oc, 0);
>
>    if (!st)
>
>    {
>
>        printf("Could not alloc new stream\n");
>
>    }
>
>    c = st->codec;
>
>    c->codec_id = codec_id;
>
>    c->codec_type = CODEC_TYPE_AUDIO;
>
>    c->bit_rate = 64000;
>
>    c->sample_rate = pCodecCtx->sample_rate;
>
>    c->channels = pCodecCtx->channels;
>
>    return st;
>
> }
>
> _______________________________________________
> libav-user mailing list
> [email protected]
> https://lists.mplayerhq.hu/mailman/listinfo/libav-user
>

Observe libavformat/output-example.c and found the following strings:
    if (c->coded_frame && c->coded_frame->pts != AV_NOPTS_VALUE)
        pkt.pts= av_rescale_q(c->coded_frame->pts, c->time_base,
st->time_base);
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

Reply via email to