From patchwork Sat Mar 17 21:05:21 2007 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Wache X-Patchwork-Id: 12445 Received: from mail.gmx.net ([213.165.64.20]) by www.linuxtv.org with smtp (Exim 4.50) id 1HSg63-0000cy-Ph for vdr@linuxtv.org; Sat, 17 Mar 2007 22:05:51 +0100 Received: (qmail invoked by alias); 17 Mar 2007 21:05:21 -0000 X-Provags-ID: V01U2FsdGVkX19nY8hW5Odn88U33TD/sfiXBOUQIUTB4X0GxYSxQN HdjIIuDLIZ3JAf Message-ID: <45FC5811.2090005@gmx.net> Date: Sat, 17 Mar 2007 22:05:21 +0100 From: Martin Wache User-Agent: Thunderbird 1.5.0.10 (Macintosh/20070221) MIME-Version: 1.0 To: VDR Mailing List Subject: Re: [vdr] softdevice audio problem. audio repacker issue? References: <200703172031.51648.stefan@lucke.in-berlin.de> <45FC4818.1020401@gmx.de> In-Reply-To: <45FC4818.1020401@gmx.de> X-Y-GMX-Trusted: 0 X-BeenThere: vdr@linuxtv.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: VDR Mailing List List-Id: VDR Mailing List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 17 Mar 2007 21:05:51 -0000 Status: O X-Status: X-Keywords: X-UID: 12478 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