Ticket #230: 0003-Simplify-and-generalize-interleaving-channels.patch

File 0003-Simplify-and-generalize-interleaving-channels.patch, 4.1 KB (added by dconrad, 3 years ago)

Simplify and generalize interleaving channels

  • A52/ACShepA52Decoder.cpp

    From 5c830145cd885cf7ae7c9151eb9baf21e9a31119 Mon Sep 17 00:00:00 2001
    From: David Conrad <davedc@Crescens.local>
    Date: Sun, 5 Aug 2007 02:56:26 -0400
    Subject: [PATCH] Simplify and generalize interleaving channels
    
    ---
     A52/ACShepA52Decoder.cpp |   95 +++++++++++++++-------------------------------
     1 files changed, 31 insertions(+), 64 deletions(-)
    
    diff --git a/A52/ACShepA52Decoder.cpp b/A52/ACShepA52Decoder.cpp
    index 9c4d971..5bef1c8 100644
    a b  
    499499         
    500500        cast_samples = (inPtr *)output_samples; 
    501501         
    502         // It is 256 samples 
     502        int chans = ChannelCount(a52_flags); 
     503        int chanMask = a52_flags & A52_CHANNEL_MASK; 
     504        int centerPresent = 0; 
    503505         
    504         // ME.f is using 16-bit 
     506        // each element is the liba52 channel number of the CA channel number of the index 
     507        int chanMap[6] = {0, 1, 2, 3, 4}; 
    505508         
    506         switch(a52_flags & A52_CHANNEL_MASK) {           
     509         
     510        if (chanMask == A52_3F || chanMask == A52_3F1R || chanMask == A52_3F2R) { 
     511                chanMap[1] = 2;                 // right 
     512                chanMap[2] = 1;                 // center 
     513                centerPresent = 1; 
     514        } 
     515         
     516        if (a52_flags & A52_LFE) { 
     517                for (int i = 0; i < 5; i++) 
     518                        chanMap[i]++; 
    507519                 
    508                 // 5 Channel 
    509                 case A52_3F2R: 
    510                          
    511                         // With LFE 
    512                         if (a52_flags & A52_LFE) { 
    513                                 //fprintf(stderr, "ACShepA52Decoder::Process16BitSignedInts: Running 5.1\n"); 
    514                                  
    515                                 for (int k = 0; k < 256; k++) { 
    516                                         output_data[6*k + output_data_offset + 3] =  cast_samples[k + 256*0]; // LFE chan  
    517                                         output_data[6*k + output_data_offset + 0] =  cast_samples[k + 256*1]; // left chan  
    518                                         output_data[6*k + output_data_offset + 2] =  cast_samples[k + 256*2]; // center chan  
    519                                         output_data[6*k + output_data_offset + 1] =  cast_samples[k + 256*3]; // right chan  
    520                                         output_data[6*k + output_data_offset + 4] =  cast_samples[k + 256*4]; // left surround chan  
    521                                         output_data[6*k + output_data_offset + 5] =  cast_samples[k + 256*5]; // right surround chan  
    522                                 } 
    523                                  
    524                                 return 6 * 256; // Number of 'UInt16' we processed 
    525                                  
    526                         } else { 
    527                                 //fprintf(stderr, "ACShepA52Decoder::Process16BitSignedInts: Running 5.0\n"); 
    528                                 for (int k = 0; k < 256; k++) { 
    529                                         output_data[5*k + output_data_offset + 0] = cast_samples[k + 256*0]; // left chan  
    530                                         output_data[5*k + output_data_offset + 2] = cast_samples[k + 256*1]; // center chan  
    531                                         output_data[5*k + output_data_offset + 1] = cast_samples[k + 256*2]; // right chan  
    532                                         output_data[5*k + output_data_offset + 3] = cast_samples[k + 256*3]; // left surround chan  
    533                                         output_data[5*k + output_data_offset + 4] = cast_samples[k + 256*4]; // right surround chan  
    534                                 } 
    535                                  
    536                                 return 5 * 256; // Number of 'UInt16' we processed 
    537                         } 
    538                         break; 
    539                          
    540                         // Stereo 
    541                 case A52_STEREO: 
    542                 case A52_DOLBY:  
    543                         //fprintf(stderr, "ACShepA52Decoder::Process16BitSignedInts: Running stereo\n"); 
    544                          
    545                         for (int k = 0; k < 256; k++) { 
    546                                 output_data[2*k + output_data_offset]     =  cast_samples[k];       // left chan  
    547                                 output_data[2*k + output_data_offset + 1] =  cast_samples[k + 256]; // right chan  
    548                         } 
    549                          
    550                         return 2 * 256; // Number of 'UInt16' we processed 
    551                          
    552                         break; 
    553                          
    554                         // Mono 
    555                 case A52_MONO: 
    556                         //fprintf(stderr, "ACShepA52Decoder::Process16BitSignedInts: Running mono\n"); 
    557                          
    558                         for (int k = 0; k < 256; k++) { 
    559                                 output_data[k + output_data_offset]     =  cast_samples[k];       // mono chan  
    560                         } 
    561                          
    562                         return 256; // Number of 'UInt16' we processed 
    563                          
    564                         break; 
    565                          
    566                 default: 
    567                         fprintf(stderr, "ACShepA52Decoder::Process16BitSignedInts: Failed to match output channels\n"); 
     520                if (centerPresent) { 
     521                        chanMap[5] = chanMap[4];        // right surround 
     522                        chanMap[4] = chanMap[3];        // left surround 
     523                        chanMap[3] = 0;                         // LFE 
     524                } else { 
     525                        chanMap[4] = chanMap[3];        // right surround 
     526                        chanMap[3] = chanMap[2];        // left surround 
     527                        chanMap[2] = 0;                         // LFE 
     528                } 
     529        } 
     530 
     531        for (int i = 0; i < 256; i++) { 
     532                for (int j = 0; j < chans; j++) { 
     533                        output_data[chans*i + output_data_offset + j] = cast_samples[i + 256*chanMap[j]]; 
     534                } 
    568535        } 
    569536         
    570         return 0; 
     537        return chans * 256; // Number of 'UInt16' we processed 
    571538} 
    572539 
    573540