Reinhard Nissl schrieb: > Hi, > > Stefan Lucke wrote: > >> Dumping the first 16 bytes of audio packets we get, shows the following: >> ff fc a4 0d b6 64 88 55 33 65 56 54 44 21 33 33 >> ff fc a4 0d 54 6a 88 65 33 44 56 54 33 33 33 33 >> ff fc a4 0d 02 a4 88 55 33 54 66 44 43 33 33 33 >> 99 77 1b e6 34 b2 5f 41 e8 5b 90 a9 d2 04 24 5e >> ff fc c4 04 7c c4 dd 44 44 66 57 55 55 55 33 33 >> ff fc c4 04 1d 61 dd 46 44 66 55 55 55 55 33 33 >> 68 6a 60 18 d8 52 92 4f 54 98 0b 93 27 22 4e 74 >> ff fc c4 04 94 01 dd 44 56 66 55 55 55 55 33 33 >> >> Is audio repacker active even for old recording ? >> When I deactivate audio repacker, sound is garbled allways. > > cAudioRepacker was introduced after VDR-1.3.26 and it is only active in > transfer mode or while recording. It is not active while replaying a > recording, so it has no influence on recordings taken with VDR-1.2.1. > > But when cAudioRepacker was not active, an audio PES packet may contain, > multiple audio frames and/or just a fragment of an audio frame at the > beginning or at the end of the PES packet. > > So if ffmpeg can only work on single and/or complete audio frames, > you'll have to break the PES packet apart and assemble the fragments at > the end and the beginning of the next PES packet.
FFmpeg can handle handle packets with multiple audio frames well, one just has to use the av_read_frame() interface instead of av_read_packet() like the softdevice currently does. There has been a change in the audio decode some time ago, before the decoder could also split the packets, that is why it worked before... I attached a patch with make the softdevice use av_read_frame(), it has still some issues, but it solves the problems Stefan reports. Is there a reason why the cAudioRepacker is used in transfer mode and during recordings, but not while replaying? Bye, Martin
Index: mpeg2decoder.c =================================================================== RCS file: /cvsroot/softdevice/softdevice/mpeg2decoder.c,v retrieving revision 1.72 diff -u -r1.72 mpeg2decoder.c --- mpeg2decoder.c 26 Feb 2007 23:00:34 -0000 1.72 +++ mpeg2decoder.c 17 Mar 2007 20:51:17 -0000 @@ -174,7 +174,7 @@ freezeMode=false; AVPacket *pkt; - while ( PacketQueue.Available() < 7 && active) { + while ( PacketQueue.Available() < 3 && active) { BUFDEB("wait while loop packets %d StreamDecoder pid:%d type %d\n", PacketQueue.Available(),getpid(),context->codec_type ); usleep(10000); @@ -1115,20 +1115,31 @@ usleep(50000); BUFDEB("av_read_frame start\n"); - //ret = av_read_frame(ic, &pkt); - ret = av_read_packet(ic, &pkt); + ret = av_read_frame(ic, &pkt); + //ret = av_read_packet(ic, &pkt); if (ret < 0) { BUFDEB("cMpeg2Decoder Stream Error!\n"); if (ThreadActive) usleep(10000); continue; } - //av_dup_packet(&pkt); + av_dup_packet(&pkt); PacketCount++; BUFDEB("got packet from av_read_frame!\n"); +#if LIBAVFORMAT_BUILD > 4623 + AVRational time_base; + time_base=ic->streams[pkt.stream_index]->time_base; + if ( pkt.pts != (int64_t) AV_NOPTS_VALUE ) { + pkt.pts=av_rescale(pkt.pts, AV_TIME_BASE* (int64_t)time_base.num, time_base.den)/100 ; + }; + + //printf("PTS: %lld new %lld num %d den %d\n",PTS,pkt.pts, + // time_base.num,time_base.den); +#else if ( pkt.pts != (int64_t) AV_NOPTS_VALUE ) pkt.pts/=9; +#endif QueuePacket(ic,pkt,packetMode); @@ -1184,9 +1195,6 @@ void cMpeg2Decoder::QueuePacket(const AVFormatContext *ic, AVPacket &pkt, bool PacketMode) { - BUFDEB("QueuePacket AudioIdx: %d VideoIdx %d pkt.stream_index: %d\n", - AudioIdx,VideoIdx,pkt.stream_index); - if (!ic) { fprintf(stderr,"Error: ic is null!\n"); av_free_packet(&pkt); @@ -1212,6 +1220,8 @@ BUFDEB("Unknown packet type! Return;\n"); return; }; + BUFDEB("QueuePacket AudioIdx: %d VideoIdx %d pkt.stream_index: %d, packet_type: %d\n", + AudioIdx,VideoIdx,pkt.stream_index,packet_type); // check if there are new streams if ( AudioIdx != DONT_PLAY && packet_type == CODEC_TYPE_AUDIO
_______________________________________________ vdr mailing list vdr@linuxtv.org http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr