95
95
//___________________________________________________________________________
96
uint8_t lavMuxer::open(const char *filename, uint32_t inbitrate,ADM_MUXER_TYPE type, aviInfo *info, WAVHeader *audioheader)
96
uint8_t lavMuxer::open(const char *filename, uint32_t inbitrate,ADM_MUXER_TYPE type, aviInfo *info, WAVHeader *audioheader)
98
return open(filename,inbitrate,type,info,0,NULL,audioheader,0,NULL);
102
uint8_t lavMuxer::open(const char *filename,uint32_t inbitrate, ADM_MUXER_TYPE type, aviInfo *info,
103
uint32_t videoExtraDataSize, uint8_t *videoExtraData, WAVHeader *audioheader,
104
uint32_t audioextraSize,uint8_t *audioextraData)
98
106
AVCodecContext *c;
113
121
fmt = guess_format("svcd", NULL, NULL);
124
fmt = guess_format("mp4", NULL, NULL);
127
fmt = guess_format("psp", NULL, NULL);
141
155
c = video_st->codec;
160
if(isMpeg4Compatible(info->fcc))
162
c->codec_id = CODEC_ID_MPEG4;
163
c->has_b_frames=1; // in doubt...
166
if(isH264Compatible(info->fcc))
168
c->has_b_frames=1; // in doubt...
169
c->codec_id = CODEC_ID_H264;
170
c->codec=new AVCodec;
171
memset(c->codec,0,sizeof(AVCodec));
172
c->codec->name=ADM_strdup("H264");
176
c->codec_id = CODEC_ID_MPEG4; // Default value
177
printf("Ooops, cant mux that...\n");
178
printf("Ooops, cant mux that...\n");
179
printf("Ooops, cant mux that...\n");
183
if(videoExtraDataSize)
185
c->extradata=videoExtraData;
186
c->extradata_size= videoExtraDataSize;
190
c->rc_buffer_size=8*1024*224;
191
c->rc_max_rate=768*1000;
193
c->bit_rate=768*1000;
197
c->rc_buffer_size=8*1024*224;
198
c->rc_max_rate=9500*1000;
201
c->bit_rate=9000*1000;
203
c->bit_rate=inbitrate;
145
207
c->codec_id = CODEC_ID_MPEG2VIDEO;
146
208
c->rc_buffer_size=8*1024*224;
208
270
c->frame_rate_base = 1001;
273
if(_type==MUXER_MP4 || _type==MUXER_PSP)
275
c->time_base= (AVRational){1001,24000};
212
c->time_base= (AVRational){30000,1001};
279
c->time_base= (AVRational){1001,30000};
213
280
//c->frame_rate = 30000;
214
281
//c->frame_rate_base = 1001;
217
GUI_Error_HIG("Incompatible frame rate", NULL);
284
if(_type==MUXER_MP4 || _type==MUXER_PSP)
286
c->time_base= (AVRational){1000,_fps1000};
291
GUI_Error_HIG(_("Incompatible frame rate"), NULL);
237
314
c = audio_st->codec;
238
if(audioheader->encoding==WAV_AC3)
239
c->codec_id = CODEC_ID_AC3;
241
c->codec_id = CODEC_ID_MP2;
315
c->frame_size=1024; //For AAC mainly, sample per frame
316
printf("[LavFormat] Bitrate %u\n",(audioheader->byterate*8)/1000);
317
switch(audioheader->encoding)
319
case WAV_AC3: c->codec_id = CODEC_ID_AC3;break;
320
case WAV_MP2: c->codec_id = CODEC_ID_MP2;break;
322
#warning FIXME : Probe deeper
324
c->codec_id = CODEC_ID_MP3;
327
// One chunk is 10 ms (1/100 of fq)
329
c->codec_id = CODEC_ID_PCM_S16LE;break;
331
c->extradata=audioextraData;
332
c->extradata_size= audioextraSize;
333
c->codec_id = CODEC_ID_AAC;
336
printf("Cant mux that ! audio\n");
337
printf("Cant mux that ! audio\n");
338
c->codec_id = CODEC_ID_MP2;
242
342
c->codec_type = CODEC_TYPE_AUDIO;
244
344
c->bit_rate = audioheader->byterate*8;
245
c->sample_rate = audioheader->frequency;
345
c->rc_buffer_size=(c->bit_rate/(2*8)); // 500 ms worth
346
_audioFq=c->sample_rate = audioheader->frequency;
246
347
c->channels = audioheader->channels;
348
_audioByterate=audioheader->byterate;
250
353
//----------------------
358
oc->mux_rate=10080*1000; // Needed ?
254
362
oc->mux_rate=10080*1000;
292
400
printf("lavformat mpeg muxer initialized\n");
295
_audioByterate=audioheader->byterate;
296
one=(1000*1000*1000)/_fps1000;
404
one=(1000*1000*1000)/_fps1000;
301
409
//___________________________________________________________________________
302
uint8_t lavMuxer::writeAudioPacket(uint32_t len, uint8_t *buf)
410
uint8_t lavMuxer::writeAudioPacket(uint32_t len, uint8_t *buf,uint32_t sample)
417
if(!audio_st) return 0;
309
419
av_init_packet(&pkt);
316
pkt.dts=pkt.pts=(int64_t)floor(f+2000);
320
// pkt.flags |= PKT_FLAG_KEY;
422
pkt.dts=pkt.pts=(int64_t)sample2time_us(sample);
424
pkt.flags |= PKT_FLAG_KEY;
323
aprintf("A: frame pts%d\n",pkt.pts);
429
aprintf("A: sample: %d frame_pts: %d fq: %d\n",(int32_t )sample,(int32_t )pkt.dts,audio_st->codec->sample_rate);
431
ret = av_write_frame(oc, &pkt);
432
_lastAudioDts=pkt.dts;
435
printf("Error writing audio packet\n");
440
//________________________________________________________________________
441
uint64_t lavMuxer::sample2time_us( uint32_t sample )
447
f/=_audioFq; // Sample / Frequency = time in seconds *10E6 to get in in us
325
ret = av_write_frame(oc, &pkt);
328
printf("Error writing audio packet\n");
449
return (uint64_t)floor(f);
334
452
//___________________________________________________________________________
335
453
uint8_t lavMuxer::needAudio( void )
456
if(!audio_st) return 0;
344
dts=(uint64_t)floor(f);
459
uint64_t dts=_lastAudioDts; // Last audio dts
345
462
aprintf("Need audio ?: %llu / %llu : %llu\n ",dts,_curDTS,_curDTS+one);
346
if((dts>=_curDTS) && (dts<=_curDTS+one)) return 1;
463
if((dts+5000>=_curDTS) && (dts<=_curDTS+one)) return 1;
349
466
printf("LavMuxer:Audio DTS is too low %llu / %llu!\n",dts,_curDTS);
354
471
//___________________________________________________________________________
355
uint8_t lavMuxer::writeVideoPacket(uint32_t len, uint8_t *buf,uint32_t frameno,uint32_t displayframe)
472
uint8_t lavMuxer::writeVideoPacket(ADMBitstream *bitstream)
361
478
av_init_packet(&pkt);
363
p=displayframe+2; // Pts
480
p=bitstream->ptsFrame+1; // Pts // Time p/fps1000=out/den out=p*den*1000/fps1000
364
481
p=(p*1000*1000*1000);
482
p=p/_fps1000; // in us
484
d=bitstream->dtsFrame; // dts
368
485
d=(d*1000*1000*1000);
372
_curDTS=(int64_t)floor(d);
489
_curDTS=(int64_t)floor(d);
492
#define RESCALE(x) x=x*video_st->codec->time_base.den*1000.;\
495
p=bitstream->ptsFrame+1;
498
d=bitstream->dtsFrame;
374
501
pkt.dts=(int64_t)floor(d);
375
502
pkt.pts=(int64_t)floor(p);
504
// printf("Lavformat : Pts :%u dts:%u",displayframe,frameno);
377
505
aprintf("Lavformat : Pts :%llu dts:%llu",pkt.pts,pkt.dts);
378
506
pkt.stream_index=0;
508
pkt.data= bitstream->data;
509
pkt.size= bitstream->len;
382
510
// Look if it is a gop start or seq start
383
if(!buf[0] && !buf[1] && buf[2]==1)
511
if(_type==MUXER_MP4 || _type==MUXER_PSP)
513
if(bitstream->flags & AVI_KEY_FRAME)
514
pkt.flags |= PKT_FLAG_KEY;
516
if(!bitstream->data[0] && !bitstream->data[1] && bitstream->data[2]==1)
385
if(buf[3]==0xb3 || buf[3]==0xb8 ) // Seq start or gop start
518
if(bitstream->data[3]==0xb3 || bitstream->data[3]==0xb8 ) // Seq start or gop start
386
519
pkt.flags |= PKT_FLAG_KEY;
387
520
//printf("Intra\n");
393
526
printf("Error writing video packet\n");
396
aprintf("V: frame %lu pts%d\n",frameno,pkt.pts);
529
aprintf("V: frame %lu pts%d\n",bitstream->dtsFrame,pkt.pts);
572
extern int mpegps_init(void );
573
extern int movenc_init(void );
575
extern URLProtocol file_protocol ;
576
extern AVInputFormat matroska_demuxer;
577
uint8_t lavformat_init(void)
581
av_register_input_format(&matroska_demuxer);
582
register_protocol(&file_protocol);
437
585
//___________________________________________________________________________