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

Reply via email to