Ticket #5487: fixes-latm-aac.2.patch

File fixes-latm-aac.2.patch, 28.2 KB (added by jyavenard@…, 3 years ago)

Updated patches for 0.21-fixes.. Tested to compile properly

  • libs/libavcodec/aac_parser.c

    diff -Naur --exclude=.svn mythtv.ori/libs/libavcodec/aac_parser.c mythtv/libs/libavcodec/aac_parser.c
    old new  
    2828#define AAC_HEADER_SIZE 7 
    2929 
    3030 
    31 static const int aac_sample_rates[16] = { 
     31const int aac_sample_rates[16] = { 
    3232    96000, 88200, 64000, 48000, 44100, 32000, 
    3333    24000, 22050, 16000, 12000, 11025, 8000, 7350 
    3434}; 
    3535 
    36 static const int aac_channels[8] = { 
     36const int aac_channels[8] = { 
    3737    0, 1, 2, 3, 4, 5, 6, 8 
    3838}; 
    3939 
  • libs/libavcodec/allcodecs.c

    diff -Naur --exclude=.svn mythtv.ori/libs/libavcodec/allcodecs.c mythtv/libs/libavcodec/allcodecs.c
    old new  
    271271    REGISTER_ENCDEC  (LIBAMR_WB, libamr_wb); 
    272272    REGISTER_ENCODER (LIBFAAC, libfaac); 
    273273    REGISTER_DECODER (LIBFAAD, libfaad); 
     274    REGISTER_DECODER (LIBFAAD, libfaad2); 
    274275    REGISTER_ENCDEC  (LIBGSM, libgsm); 
    275276    REGISTER_ENCDEC  (LIBGSM_MS, libgsm_ms); 
    276277    REGISTER_ENCODER (LIBMP3LAME, libmp3lame); 
     
    281282 
    282283    /* parsers */ 
    283284    REGISTER_PARSER  (AAC, aac); 
     285    REGISTER_PARSER  (AAC, latm); 
    284286    REGISTER_PARSER  (AC3, ac3); 
    285287    REGISTER_PARSER  (CAVSVIDEO, cavsvideo); 
    286288    REGISTER_PARSER  (DCA, dca); 
  • libs/libavcodec/avcodec.h

    diff -Naur --exclude=.svn mythtv.ori/libs/libavcodec/avcodec.h mythtv/libs/libavcodec/avcodec.h
    old new  
    240240#if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0) 
    241241    CODEC_ID_MPEG4AAC, 
    242242#endif 
     243    CODEC_ID_AAC_LATM, 
    243244    CODEC_ID_AC3, 
    244245    CODEC_ID_DTS, 
    245246    CODEC_ID_VORBIS, 
  • libs/libavcodec/latmaac.c

    diff -Naur --exclude=.svn mythtv.ori/libs/libavcodec/latmaac.c mythtv/libs/libavcodec/latmaac.c
    old new  
     1/* 
     2 * copyright (c) 2008 Paul Kendall <paul@kcbbs.gen.nz> 
     3 * 
     4 * This file is part of FFmpeg. 
     5 * 
     6 * FFmpeg is free software; you can redistribute it and/or 
     7 * modify it under the terms of the GNU Lesser General Public 
     8 * License as published by the Free Software Foundation; either 
     9 * version 2.1 of the License, or (at your option) any later version. 
     10 * 
     11 * FFmpeg is distributed in the hope that it will be useful, 
     12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
     14 * Lesser General Public License for more details. 
     15 * 
     16 * You should have received a copy of the GNU Lesser General Public 
     17 * License along with FFmpeg; if not, write to the Free Software 
     18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 
     19 */ 
     20 
     21/** 
     22 * @file latmaac.c 
     23 * LATM wrapped AAC decoder 
     24 */ 
     25 
     26#include <stdio.h> 
     27#include <stdlib.h> 
     28#include <string.h> 
     29#include <math.h> 
     30#include <sys/types.h> 
     31 
     32#include "parser.h" 
     33#include "bitstream.h" 
     34#include "neaacdec.h" 
     35 
     36extern const int aac_sample_rates[16]; 
     37extern const uint8_t aac_channels[8]; 
     38 
     39#define min(a,b) ((a)<(b) ? (a) : (b)) 
     40 
     41 
     42/* 
     43    Note: This decoder filter is intended to decode LATM streams transferred 
     44    in MPEG transport streams which are only supposed to contain one program. 
     45    To do a more complex LATM demuxing a separate LATM demuxer should be used. 
     46*/ 
     47 
     48#define AAC_NONE 0            // mode not detected (or indicated in mediatype) 
     49#define AAC_LATM 1            // LATM packets (ISO/IEC 14496-3  1.7.3 Multiplex layer) 
     50 
     51#define SYNC_LATM 0x2b7            // 11 bits 
     52 
     53#define MAX_SIZE 8*1024 
     54 
     55typedef struct AACConfig 
     56{ 
     57    uint8_t    extra[64];            // should be way enough 
     58    int        extrasize; 
     59 
     60    int        audioObjectType; 
     61    int        samplingFrequencyIndex; 
     62    int        samplingFrequency; 
     63    int        channelConfiguration; 
     64    int        channels; 
     65} AACConfig; 
     66 
     67typedef struct AACParser 
     68{ 
     69    AACConfig          config; 
     70    uint8_t            frameLengthType; 
     71    uint16_t           muxSlotLengthBytes; 
     72 
     73    uint8_t            audio_mux_version; 
     74    uint8_t            audio_mux_version_A; 
     75    int                taraFullness; 
     76    uint8_t            config_crc; 
     77    int64_t            other_data_bits; 
     78 
     79    int                mode; 
     80    int                offset;        // byte offset in "buf" buffer 
     81    uint8_t            buf[MAX_SIZE]; // allocated buffer 
     82    int                count;         // number of bytes written in buffer 
     83} AACParser; 
     84 
     85typedef struct AACDecoder  
     86{ 
     87    AACParser          *parser; 
     88    faacDecHandle      aac_decoder; 
     89    int                open; 
     90    uint32_t           in_samplerate; 
     91    uint8_t            in_channels; 
     92} AACDecoder; 
     93 
     94typedef struct { 
     95    AACDecoder*        decoder; 
     96} FAACContext; 
     97 
     98static inline int64_t latm_get_value(GetBitContext *b) 
     99{ 
     100    uint8_t bytesForValue = get_bits(b, 2); 
     101    int64_t value = 0; 
     102    int i; 
     103    for (i=0; i<=bytesForValue; i++) { 
     104        value <<= 8; 
     105        value |= get_bits(b, 8); 
     106    } 
     107    return value; 
     108} 
     109 
     110static void readGASpecificConfig(struct AACConfig *cfg, GetBitContext *b, PutBitContext *o) 
     111{ 
     112    int framelen_flag = get_bits(b, 1); 
     113    put_bits(o, 1, framelen_flag); 
     114    int dependsOnCoder = get_bits(b, 1); 
     115    put_bits(o, 1, dependsOnCoder); 
     116    int ext_flag; 
     117    int delay; 
     118    int layerNr; 
     119 
     120    if (dependsOnCoder) { 
     121        delay = get_bits(b, 14); 
     122        put_bits(o, 14, delay); 
     123    } 
     124    ext_flag = get_bits(b, 1); 
     125    put_bits(o, 1, ext_flag); 
     126    if (!cfg->channelConfiguration) { 
     127        // program config element 
     128        // TODO: 
     129    } 
     130 
     131    if (cfg->audioObjectType == 6 || cfg->audioObjectType == 20) { 
     132        layerNr = get_bits(b, 3); 
     133        put_bits(o, 3, layerNr); 
     134    } 
     135    if (ext_flag) { 
     136        if (cfg->audioObjectType == 22) { 
     137            skip_bits(b, 5);                    // numOfSubFrame 
     138            skip_bits(b, 11);                    // layer_length 
     139 
     140            put_bits(o, 16, 0); 
     141        } 
     142        if (cfg->audioObjectType == 17 || 
     143            cfg->audioObjectType == 19 || 
     144            cfg->audioObjectType == 20 || 
     145            cfg->audioObjectType == 23) { 
     146 
     147            skip_bits(b, 3);                    // stuff 
     148            put_bits(o, 3, 0); 
     149        } 
     150 
     151        skip_bits(b, 1);                        // extflag3 
     152        put_bits(o, 1, 0); 
     153    } 
     154} 
     155 
     156static int readAudioSpecificConfig(struct AACConfig *cfg, GetBitContext *b) 
     157{ 
     158    PutBitContext o; 
     159    init_put_bits(&o, cfg->extra, sizeof(cfg->extra)); 
     160 
     161    // returns the number of bits read 
     162    int ret = 0; 
     163    int sbr_present = -1; 
     164 
     165    // object 
     166    cfg->audioObjectType = get_bits(b, 5); 
     167        put_bits(&o, 5, cfg->audioObjectType); 
     168    if (cfg->audioObjectType == 31) { 
     169        uint8_t n = get_bits(b, 6); 
     170        put_bits(&o, 6, n); 
     171        cfg->audioObjectType = 32 + n; 
     172    } 
     173 
     174    cfg->samplingFrequencyIndex = get_bits(b, 4); 
     175    cfg->samplingFrequency = aac_sample_rates[cfg->samplingFrequencyIndex]; 
     176    put_bits(&o, 4, cfg->samplingFrequencyIndex); 
     177    if (cfg->samplingFrequencyIndex == 0x0f) { 
     178        uint32_t f = get_bits_long(b, 24); 
     179        put_bits(&o, 24, f); 
     180        cfg->samplingFrequency = f; 
     181    } 
     182    cfg->channelConfiguration = get_bits(b, 4); 
     183    put_bits(&o, 4, cfg->channelConfiguration); 
     184    cfg->channels = aac_channels[cfg->channelConfiguration]; 
     185 
     186    if (cfg->audioObjectType == 5) { 
     187        sbr_present = 1; 
     188 
     189        // TODO: parsing !!!!!!!!!!!!!!!! 
     190    } 
     191 
     192    switch (cfg->audioObjectType) { 
     193    case 1: 
     194    case 2: 
     195    case 3: 
     196    case 4: 
     197    case 6: 
     198    case 7: 
     199    case 17: 
     200    case 19: 
     201    case 20: 
     202    case 21: 
     203    case 22: 
     204    case 23: 
     205        readGASpecificConfig(cfg, b, &o); 
     206        break; 
     207    } 
     208 
     209    if (sbr_present == -1) { 
     210        if (cfg->samplingFrequency <= 24000) { 
     211            cfg->samplingFrequency *= 2; 
     212        }             
     213    } 
     214 
     215    // count the extradata 
     216    ret = put_bits_count(&o); 
     217    align_put_bits(&o); 
     218    flush_put_bits(&o); 
     219    cfg->extrasize = (ret + 7) >> 3; 
     220    return ret; 
     221} 
     222 
     223static void readStreamMuxConfig(struct AACParser *parser, GetBitContext *b) 
     224{ 
     225    parser->audio_mux_version_A = 0; 
     226    parser->audio_mux_version = get_bits(b, 1); 
     227    if (parser->audio_mux_version == 1) {                // audioMuxVersion 
     228        parser->audio_mux_version_A = get_bits(b, 1); 
     229    } 
     230 
     231    if (parser->audio_mux_version_A == 0) { 
     232        if (parser->audio_mux_version == 1) { 
     233            parser->taraFullness = latm_get_value(b); 
     234        } 
     235        get_bits(b, 1);                    // allStreamSameTimeFraming = 1 
     236        get_bits(b, 6);                    // numSubFrames = 0 
     237        get_bits(b, 4);                    // numPrograms = 0 
     238 
     239        // for each program 
     240        get_bits(b, 3);                    // numLayer = 0 
     241 
     242        // for each layer 
     243        if (parser->audio_mux_version == 0) { 
     244            // audio specific config. 
     245            readAudioSpecificConfig(&parser->config, b); 
     246        } else { 
     247            int ascLen = latm_get_value(b); 
     248            ascLen -= readAudioSpecificConfig(&parser->config, b); 
     249 
     250            // fill bits 
     251            while (ascLen > 16) { 
     252                skip_bits(b, 16); 
     253                ascLen -= 16; 
     254            } 
     255            skip_bits(b, ascLen);                     
     256        } 
     257 
     258        // these are not needed... perhaps 
     259        int frame_length_type = get_bits(b, 3); 
     260        parser->frameLengthType = frame_length_type; 
     261        if (frame_length_type == 0) { 
     262            get_bits(b, 8); 
     263        } else if (frame_length_type == 1) { 
     264            get_bits(b, 9); 
     265        } else if (frame_length_type == 3 || 
     266            frame_length_type == 4 || 
     267            frame_length_type == 5) { 
     268            int celp_table_index = get_bits(b, 6); 
     269        } else if (frame_length_type == 6 || 
     270            frame_length_type == 7) { 
     271            int hvxc_table_index = get_bits(b, 1); 
     272        } 
     273 
     274        // other data 
     275        parser->other_data_bits = 0; 
     276        if (get_bits(b, 1)) { 
     277            // other data present 
     278            if (parser->audio_mux_version == 1) { 
     279                parser->other_data_bits = latm_get_value(b); 
     280            } else { 
     281                // other data not present 
     282                parser->other_data_bits = 0; 
     283                int esc, tmp; 
     284                do { 
     285                    parser->other_data_bits <<= 8; 
     286                    esc = get_bits(b, 1); 
     287                    tmp = get_bits(b, 8); 
     288                    parser->other_data_bits |= tmp; 
     289                } while (esc); 
     290            } 
     291        } 
     292 
     293        // CRC 
     294        if (get_bits(b, 1)) { 
     295            parser->config_crc = get_bits(b, 8); 
     296        } 
     297    } else { 
     298        // tbd 
     299    } 
     300} 
     301 
     302static void readPayloadLengthInfo(struct AACParser *parser, GetBitContext *b) 
     303{ 
     304    uint8_t tmp; 
     305    if (parser->frameLengthType == 0) { 
     306        parser->muxSlotLengthBytes = 0; 
     307        do { 
     308            tmp = get_bits(b, 8); 
     309            parser->muxSlotLengthBytes += tmp; 
     310        } while (tmp == 255); 
     311    } else { 
     312        if (parser->frameLengthType == 5 || 
     313            parser->frameLengthType == 7 || 
     314            parser->frameLengthType == 3) { 
     315            get_bits(b, 2); 
     316        } 
     317    } 
     318} 
     319 
     320static void readAudioMuxElement(struct AACParser *parser, GetBitContext *b, uint8_t *payload, int *payloadsize) 
     321{ 
     322    uint8_t    use_same_mux = get_bits(b, 1); 
     323    if (!use_same_mux) { 
     324        readStreamMuxConfig(parser, b); 
     325    } 
     326 
     327    if (parser->audio_mux_version_A == 0) { 
     328        int j; 
     329 
     330        readPayloadLengthInfo(parser, b); 
     331 
     332        // copy data 
     333        for (j=0; j<parser->muxSlotLengthBytes; j++) { 
     334            *payload++ = get_bits(b, 8); 
     335        } 
     336        *payloadsize = parser->muxSlotLengthBytes; 
     337 
     338        // ignore otherdata 
     339    } else { 
     340        // TBD 
     341    } 
     342} 
     343 
     344static int readAudioSyncStream(struct AACParser *parser, GetBitContext *b, int size, uint8_t *payload, int *payloadsize) 
     345{ 
     346    // ISO/IEC 14496-3 Table 1.28 - Syntax of AudioMuxElement() 
     347    if (get_bits(b, 11) != 0x2b7) return -1;        // not LATM 
     348    int muxlength = get_bits(b, 13); 
     349 
     350    if (3+muxlength > size) return 0;            // not enough data 
     351 
     352    readAudioMuxElement(parser, b, payload, payloadsize); 
     353 
     354    // we don't parse anything else here... 
     355    return (3+muxlength); 
     356} 
     357 
     358 
     359static void flush_buf(struct AACParser *parser, int offset) { 
     360    int bytes_to_flush = min(parser->count, offset); 
     361    int left = (parser->count - bytes_to_flush); 
     362 
     363    if (bytes_to_flush > 0) { 
     364        if (left > 0) { 
     365            memcpy(parser->buf, parser->buf+bytes_to_flush, left); 
     366            parser->count = left; 
     367        } else { 
     368            parser->count = 0; 
     369        } 
     370    } 
     371} 
     372 
     373static struct AACParser *latm_create_parser() 
     374{ 
     375    struct AACParser *parser = (struct AACParser *)av_malloc(sizeof(struct AACParser)); 
     376    memset(parser, 0, sizeof(struct AACParser)); 
     377    return parser; 
     378} 
     379 
     380static void latm_destroy_parser(struct AACParser *parser) 
     381{ 
     382    av_free(parser); 
     383} 
     384 
     385static void latm_flush(struct AACParser *parser) 
     386{ 
     387    parser->offset = 0; 
     388    parser->count = 0; 
     389} 
     390 
     391static void latm_write_data(struct AACParser *parser, uint8_t *data, int len) 
     392{ 
     393    // buffer overflow check... just ignore the data before 
     394    if (parser->count + len > MAX_SIZE) { 
     395        flush_buf(parser, parser->offset); 
     396        parser->offset = 0; 
     397        if (parser->count + len > MAX_SIZE) { 
     398            int to_flush = (parser->count+len) - MAX_SIZE; 
     399            flush_buf(parser, to_flush); 
     400        } 
     401    } 
     402 
     403    // append data 
     404    memcpy(parser->buf+parser->count, data, len); 
     405    parser->count += len; 
     406} 
     407 
     408static int latm_parse_packet(struct AACParser *parser, uint8_t *data, int maxsize) 
     409{ 
     410    /* 
     411        Return value is either number of bytes parsed or 
     412        -1 when failed. 
     413        0 = need more data. 
     414    */ 
     415 
     416    uint8_t    *start = parser->buf + parser->offset; 
     417    int        bytes  = parser->count - parser->offset; 
     418    GetBitContext    b; 
     419    init_get_bits(&b, start, bytes * 8); 
     420 
     421    if (parser->mode == AAC_LATM) { 
     422        int outsize = 0; 
     423        int    ret = readAudioSyncStream(parser, &b, bytes, data, &outsize); 
     424 
     425        if (ret < 0) return -1; 
     426        if (ret == 0) return 0; 
     427 
     428        // update the offset 
     429        parser->offset += ret; 
     430        return outsize; 
     431    } 
     432 
     433    // check for syncwords 
     434    while (bytes > 2) { 
     435        if (show_bits(&b, 11) == SYNC_LATM) { 
     436            // we must parse config first... 
     437            int outsize = 0; 
     438 
     439            // check if there is a complete packet available... 
     440            int ret = readAudioSyncStream(parser, &b, bytes, data, &outsize); 
     441            if (ret < 0) return -1; 
     442            if (ret == 0) return 0; 
     443            parser->offset += ret; 
     444 
     445            parser->mode = AAC_LATM; 
     446            return outsize; 
     447        } 
     448        skip_bits(&b, 8); 
     449        parser->offset++; 
     450        bytes--; 
     451    } 
     452    return 0; 
     453} 
     454 
     455static void aac_filter_close(AACDecoder *decoder) 
     456{ 
     457    if (decoder->aac_decoder) { 
     458        NeAACDecClose(decoder->aac_decoder); 
     459        decoder->aac_decoder = NULL; 
     460    } 
     461    decoder->open = 0; 
     462} 
     463 
     464static int aac_decoder_open(AACDecoder *decoder) 
     465{ 
     466    if (decoder->aac_decoder) return 0; 
     467 
     468    decoder->aac_decoder = NeAACDecOpen(); 
     469    if (!decoder->aac_decoder) return -1; 
     470 
     471    // are we going to initialize from decoder specific info ? 
     472    if (decoder->parser->config.extrasize > 0) { 
     473        char ret = NeAACDecInit2(decoder->aac_decoder, (unsigned char*)decoder->parser->config.extra, decoder->parser->config.extrasize, &decoder->in_samplerate, &decoder->in_channels); 
     474        if (ret < 0) { 
     475            aac_filter_close(decoder);        // gone wrong ? 
     476            return -1; 
     477        } 
     478        decoder->open = 1; 
     479    } else { 
     480        // we'll open the decoder later... 
     481        decoder->open = 0; 
     482    } 
     483    return 0; 
     484} 
     485 
     486AACDecoder *aac_filter_create() 
     487{ 
     488    AACDecoder *decoder = (AACDecoder *)av_malloc(sizeof(AACDecoder)); 
     489    decoder->parser = latm_create_parser(); 
     490    decoder->aac_decoder = NULL; 
     491    decoder->open = 0; 
     492    return (void *)decoder; 
     493} 
     494 
     495void aac_filter_destroy(AACDecoder *decoder) 
     496{ 
     497    aac_filter_close(decoder); 
     498    latm_destroy_parser(decoder->parser); 
     499    av_free(decoder); 
     500} 
     501 
     502int aac_filter_receive(AACDecoder *decoder, void *out, int *out_size, uint8_t *data, int size) 
     503{ 
     504    uint8_t    tempbuf[32*1024]; 
     505    int        ret; 
     506    int        consumed = size; 
     507    int        decoded; 
     508    int        max_size = *out_size; 
     509     
     510    *out_size = 0; 
     511 
     512    //------------------------------------------------------------------------- 
     513    // Multiplex Parsing 
     514    //------------------------------------------------------------------------- 
     515 
     516    latm_write_data(decoder->parser, data, size); 
     517 
     518    do { 
     519        ret = latm_parse_packet(decoder->parser, tempbuf, sizeof(tempbuf)); 
     520                if (ret < 0) { 
     521                        latm_flush(decoder->parser); 
     522                        return consumed; 
     523                } 
     524        if (ret == 0) return consumed; 
     525 
     526        data = tempbuf; 
     527        size = ret; 
     528 
     529        //------------------------------------------------------------------------- 
     530        // Initialize decoder (if necessary) 
     531        //------------------------------------------------------------------------- 
     532        if (!decoder->open) { 
     533            aac_filter_close(decoder); 
     534            if (decoder->parser->mode == AAC_LATM) { 
     535                ret = aac_decoder_open(decoder); 
     536                if (ret < 0) return consumed; 
     537            } 
     538 
     539            if(!decoder->open) return consumed; 
     540        } 
     541 
     542        //------------------------------------------------------------------------- 
     543        // Decode samples 
     544        //------------------------------------------------------------------------- 
     545        NeAACDecFrameInfo    info; 
     546        void *buf = NeAACDecDecode(decoder->aac_decoder, &info, data, size); 
     547 
     548        if (buf) { 
     549            decoder->in_samplerate = info.samplerate; 
     550            decoder->in_channels = info.channels; 
     551 
     552            //--------------------------------------------------------------------- 
     553            // Deliver decoded samples 
     554            //--------------------------------------------------------------------- 
     555 
     556            // kram dekoduje 16-bit. my vypustame 16-bit. takze by to malo byt okej 
     557            decoded = info.samples * sizeof(short); 
     558 
     559            // napraskame tam sample 
     560            *out_size += decoded; 
     561            if(*out_size > max_size) { 
     562                av_log(NULL, AV_LOG_ERROR, "overflow!\n"); 
     563            } else { 
     564                memcpy(out, buf, decoded); 
     565                out = (unsigned char *)out + decoded; 
     566            } 
     567        } else { 
     568            // need more data 
     569            break; 
     570        } 
     571 
     572    } while (1);    // decode all packets 
     573    return consumed; 
     574} 
     575 
     576void aac_filter_getinfo(AACDecoder *decoder, int *sample_rate, int *channels) 
     577{ 
     578    if(!decoder->open) return; 
     579    *sample_rate = decoder->in_samplerate; 
     580    *channels = decoder->in_channels; 
     581} 
     582 
     583static int faac_decode_init(AVCodecContext *avctx) 
     584{ 
     585    FAACContext *s = avctx->priv_data; 
     586    avctx->frame_size = 360; 
     587    avctx->sample_rate = 48000; 
     588    avctx->channels = 2; 
     589    avctx->bit_rate = 8192 * 8 * avctx->sample_rate / avctx->frame_size; 
     590    s->decoder = aac_filter_create(); 
     591    return 0; 
     592} 
     593 
     594static int faac_decode_frame(AVCodecContext *avctx, 
     595                             void *data, int *data_size, 
     596                             uint8_t *buf, int buf_size) 
     597{ 
     598    FAACContext *s = avctx->priv_data; 
     599    int ret; 
     600 
     601    if (s->decoder == NULL) faac_decode_init(avctx); 
     602    ret = aac_filter_receive(s->decoder, data, data_size, buf, buf_size); 
     603    aac_filter_getinfo(s->decoder, &(avctx->sample_rate), &(avctx->channels)); 
     604    return ret; 
     605} 
     606 
     607static int faac_decode_end(AVCodecContext *avctx) 
     608{ 
     609    FAACContext *s = avctx->priv_data; 
     610    if(s->decoder != NULL) { 
     611        aac_filter_destroy(s->decoder); 
     612    } 
     613    return 0; 
     614} 
     615 
     616 
     617 
     618#define LATM_HEADER     0x56e000        // 0x2b7 (11 bits) 
     619#define LATM_MASK       0xFFE000        // top 11 bits 
     620#define LATM_SIZE_MASK  0x001FFF        // bottom 13 bits 
     621 
     622typedef struct LATMParseContext{ 
     623    ParseContext pc; 
     624    int count; 
     625} LATMParseContext; 
     626 
     627/** 
     628 * finds the end of the current frame in the bitstream. 
     629 * @return the position of the first byte of the next frame, or -1 
     630 */ 
     631static int latm_find_frame_end(AVCodecParserContext *s1, const uint8_t *buf, 
     632                               int buf_size) { 
     633    LATMParseContext *s = s1->priv_data; 
     634    ParseContext *pc = &s->pc; 
     635    int pic_found, i; 
     636    uint32_t state; 
     637 
     638    pic_found = pc->frame_start_found; 
     639    state = pc->state; 
     640 
     641    i = 0; 
     642    if(!pic_found){ 
     643        for(i=0; i<buf_size; i++){ 
     644            state = (state<<8) | buf[i]; 
     645            if((state & LATM_MASK) == LATM_HEADER){ 
     646                i++; 
     647                s->count = - i; 
     648                pic_found=1; 
     649                break; 
     650            } 
     651        } 
     652    } 
     653 
     654    if(pic_found){ 
     655        /* EOF considered as end of frame */ 
     656        if (buf_size == 0) 
     657            return 0; 
     658        if((state & LATM_SIZE_MASK) - s->count <= buf_size) { 
     659            pc->frame_start_found = 0; 
     660            pc->state = -1; 
     661            return (state & LATM_SIZE_MASK) - s->count; 
     662        } 
     663    } 
     664 
     665    s->count += buf_size; 
     666    pc->frame_start_found = pic_found; 
     667    pc->state = state; 
     668    return END_NOT_FOUND; 
     669} 
     670 
     671static int latm_parse(AVCodecParserContext *s1, 
     672                           AVCodecContext *avctx, 
     673                           const uint8_t **poutbuf, int *poutbuf_size, 
     674                           const uint8_t *buf, int buf_size) 
     675{ 
     676    LATMParseContext *s = s1->priv_data; 
     677    ParseContext *pc = &s->pc; 
     678    int next; 
     679 
     680    if(s1->flags & PARSER_FLAG_COMPLETE_FRAMES){ 
     681        next = buf_size; 
     682    }else{ 
     683        next = latm_find_frame_end(s1, buf, buf_size); 
     684 
     685        if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) { 
     686            *poutbuf = NULL; 
     687            *poutbuf_size = 0; 
     688            return buf_size; 
     689        } 
     690    } 
     691    *poutbuf = buf; 
     692    *poutbuf_size = buf_size; 
     693    return next; 
     694} 
     695 
     696static int latm_split(AVCodecContext *avctx, 
     697                           const uint8_t *buf, int buf_size) 
     698{ 
     699    int i; 
     700    uint32_t state= -1; 
     701 
     702    for(i=0; i<buf_size; i++){ 
     703        state= (state<<8) | buf[i]; 
     704        if((state & LATM_MASK) == LATM_HEADER) 
     705            return i-2; 
     706    } 
     707    return 0; 
     708} 
     709 
     710AVCodec libfaad2_decoder = { 
     711    .name = "AAC/LATM", 
     712    .type = CODEC_TYPE_AUDIO, 
     713    .id = CODEC_ID_AAC_LATM, 
     714    .priv_data_size = sizeof (FAACContext), 
     715    .init = faac_decode_init, 
     716    .close = faac_decode_end, 
     717    .decode = faac_decode_frame, 
     718}; 
     719 
     720AVCodecParser latm_parser = { 
     721    { CODEC_ID_AAC_LATM }, 
     722    sizeof(LATMParseContext), 
     723    NULL, 
     724    latm_parse, 
     725    ff_parse_close, 
     726    latm_split, 
     727}; 
  • libs/libavcodec/libavcodec.pro

    diff -Naur --exclude=.svn mythtv.ori/libs/libavcodec/libavcodec.pro mythtv/libs/libavcodec/libavcodec.pro
    old new  
    317317contains( CONFIG_LIBA52, yes )                  { SOURCES *= liba52.c } 
    318318contains( CONFIG_LIBAMR, yes )                  { SOURCES *= libamr.c } 
    319319contains( CONFIG_LIBFAAC, yes )                 { SOURCES *= libfaac.c } 
    320 contains( CONFIG_LIBFAAD, yes )                 { SOURCES *= libfaad.c } 
     320contains( CONFIG_LIBFAAD, yes )                 { SOURCES *= libfaad.c latmaac.c } 
    321321contains( CONFIG_LIBGSM, yes )                  { SOURCES *= libgsm.c } 
    322322contains( CONFIG_LIBMP3LAME, yes )              { SOURCES *= libmp3lame.c } 
    323323contains( CONFIG_LIBTHEORA, yes )               { SOURCES *= libtheoraenc.c } 
  • libs/libavcodec/libfaad.c

    diff -Naur --exclude=.svn mythtv.ori/libs/libavcodec/libfaad.c mythtv/libs/libavcodec/libfaad.c
    old new  
    325325 
    326326// FIXME - raw AAC files - maybe just one entry will be enough 
    327327AAC_CODEC(CODEC_ID_AAC, libfaad); 
     328AAC_CODEC(CODEC_ID_AAC_LATM, aac_latm); 
    328329#if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0) 
    329330// If it's mp4 file - usually embeded into Qt Mov 
    330331AAC_CODEC(CODEC_ID_MPEG4AAC, mpeg4aac); 
  • libs/libavformat/mpeg.c

    diff -Naur --exclude=.svn mythtv.ori/libs/libavformat/mpeg.c mythtv/libs/libavformat/mpeg.c
    old new  
    443443        } else if(es_type == STREAM_TYPE_AUDIO_AAC){ 
    444444            codec_id = CODEC_ID_AAC; 
    445445            type = CODEC_TYPE_AUDIO; 
     446        } else if(es_type == STREAM_TYPE_AUDIO_AAC_LATM){ 
     447            codec_id = CODEC_ID_AAC_LATM; 
     448            type = CODEC_TYPE_AUDIO; 
    446449        } else if(es_type == STREAM_TYPE_VIDEO_MPEG4){ 
    447450            codec_id = CODEC_ID_MPEG4; 
    448451            type = CODEC_TYPE_VIDEO; 
  • libs/libavformat/mpeg.h

    diff -Naur --exclude=.svn mythtv.ori/libs/libavformat/mpeg.h mythtv/libs/libavformat/mpeg.h
    old new  
    5050#define STREAM_TYPE_PRIVATE_DATA    0x06 
    5151#define STREAM_TYPE_AUDIO_AAC       0x0f 
    5252#define STREAM_TYPE_VIDEO_MPEG4     0x10 
     53#define STREAM_TYPE_AUDIO_AAC_LATM  0x11 
    5354#define STREAM_TYPE_VIDEO_H264      0x1b 
    5455 
    5556#define STREAM_TYPE_AUDIO_AC3       0x81 
  • libs/libavformat/mpegts.c

    diff -Naur --exclude=.svn mythtv.ori/libs/libavformat/mpegts.c mythtv/libs/libavformat/mpegts.c
    old new  
    864864        case STREAM_TYPE_VIDEO_H264: 
    865865        case STREAM_TYPE_VIDEO_VC1: 
    866866        case STREAM_TYPE_AUDIO_AAC: 
     867        case STREAM_TYPE_AUDIO_AAC_LATM: 
    867868        case STREAM_TYPE_AUDIO_AC3: 
    868869        case STREAM_TYPE_AUDIO_DTS: 
    869870        case STREAM_TYPE_PRIVATE_DATA: 
     
    14341435            codec_type = CODEC_TYPE_AUDIO; 
    14351436            codec_id = CODEC_ID_AAC; 
    14361437            break; 
     1438        case STREAM_TYPE_AUDIO_AAC_LATM: 
     1439            codec_type = CODEC_TYPE_AUDIO; 
     1440            codec_id = CODEC_ID_AAC_LATM; 
     1441            break; 
    14371442        case STREAM_TYPE_AUDIO_AC3: 
    14381443            codec_type = CODEC_TYPE_AUDIO; 
    14391444            codec_id = CODEC_ID_AC3; 
  • libs/libavformat/mpegts.h

    diff -Naur --exclude=.svn mythtv.ori/libs/libavformat/mpegts.h mythtv/libs/libavformat/mpegts.h
    old new  
    5555#define STREAM_TYPE_DSMCC_B         0x0b 
    5656#define STREAM_TYPE_AUDIO_AAC       0x0f 
    5757#define STREAM_TYPE_VIDEO_MPEG4     0x10 
     58#define STREAM_TYPE_AUDIO_AAC_LATM  0x11 
    5859#define STREAM_TYPE_VIDEO_H264      0x1b 
    5960#define STREAM_TYPE_VIDEO_VC1       0xea 
    6061 
  • libs/libmythtv/mpeg/mpegtables.cpp

    diff -Naur --exclude=.svn mythtv.ori/libs/libmythtv/mpeg/mpegtables.cpp mythtv/libs/libmythtv/mpeg/mpegtables.cpp
    old new  
    772772        return "audio-mp2-layer[1,2,3]"; // EIT, PMT 
    773773    else if (StreamID::MPEG1Audio==streamID) 
    774774        return "audio-mp1-layer[1,2,3]"; // EIT, PMT 
     775    else if (StreamID::MPEG2AudioAmd1==streamID)                                                                       
     776        return "audio-aac-latm"; // EIT, PMT                                                            
    775777    else if (StreamID::AACAudio==streamID) 
    776778        return "audio-aac"; // EIT, PMT 
    777779    else if (StreamID::DTSAudio==streamID) 
  • libs/libmythtv/mpeg/mpegtables.h

    diff -Naur --exclude=.svn mythtv.ori/libs/libmythtv/mpeg/mpegtables.h mythtv/libs/libmythtv/mpeg/mpegtables.h
    old new  
    155155    { 
    156156        return ((StreamID::MPEG1Audio == type) || 
    157157                (StreamID::MPEG2Audio == type) || 
     158                (StreamID::MPEG2AudioAmd1 == type) || 
    158159                (StreamID::AACAudio   == type) || 
    159160                (StreamID::AC3Audio   == type) || 
    160161                (StreamID::DTSAudio   == type));