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
