Mercurial > libavcodec.hg
comparison parser.c @ 3098:eb3d3988aff2 libavcodec
adts aac parser
| author | mru |
|---|---|
| date | Wed, 08 Feb 2006 00:50:22 +0000 |
| parents | befacb1cb573 |
| children | 78d6bfc238f3 |
comparison
equal
deleted
inserted
replaced
| 3097:41fb9bda307d | 3098:eb3d3988aff2 |
|---|---|
| 725 } | 725 } |
| 726 } | 726 } |
| 727 return buf_ptr - buf; | 727 return buf_ptr - buf; |
| 728 } | 728 } |
| 729 | 729 |
| 730 /* also used for ADTS AAC */ | |
| 730 typedef struct AC3ParseContext { | 731 typedef struct AC3ParseContext { |
| 731 uint8_t inbuf[4096]; /* input buffer */ | 732 uint8_t inbuf[4096]; /* input buffer */ |
| 732 uint8_t *inbuf_ptr; | 733 uint8_t *inbuf_ptr; |
| 733 int frame_size; | 734 int frame_size; |
| 735 int header_size; | |
| 736 int (*sync)(const uint8_t *buf, int *channels, int *sample_rate, | |
| 737 int *bit_rate, int *samples); | |
| 734 } AC3ParseContext; | 738 } AC3ParseContext; |
| 735 | 739 |
| 736 #define AC3_HEADER_SIZE 7 | 740 #define AC3_HEADER_SIZE 7 |
| 741 #define AAC_HEADER_SIZE 8 | |
| 737 | 742 |
| 738 static const int ac3_sample_rates[4] = { | 743 static const int ac3_sample_rates[4] = { |
| 739 48000, 44100, 32000, 0 | 744 48000, 44100, 32000, 0 |
| 740 }; | 745 }; |
| 741 | 746 |
| 788 | 793 |
| 789 static const int ac3_channels[8] = { | 794 static const int ac3_channels[8] = { |
| 790 2, 1, 2, 3, 3, 4, 4, 5 | 795 2, 1, 2, 3, 3, 4, 4, 5 |
| 791 }; | 796 }; |
| 792 | 797 |
| 798 static int aac_sample_rates[16] = { | |
| 799 96000, 88200, 64000, 48000, 44100, 32000, | |
| 800 24000, 22050, 16000, 12000, 11025, 8000, 7350 | |
| 801 }; | |
| 802 | |
| 803 static int aac_channels[8] = { | |
| 804 0, 1, 2, 3, 4, 5, 6, 8 | |
| 805 }; | |
| 806 | |
| 793 static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate, | 807 static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate, |
| 794 int *bit_rate) | 808 int *bit_rate, int *samples) |
| 795 { | 809 { |
| 796 unsigned int fscod, frmsizecod, acmod, bsid, lfeon; | 810 unsigned int fscod, frmsizecod, acmod, bsid, lfeon; |
| 797 GetBitContext bits; | 811 GetBitContext bits; |
| 798 | 812 |
| 799 init_get_bits(&bits, buf, AC3_HEADER_SIZE * 8); | 813 init_get_bits(&bits, buf, AC3_HEADER_SIZE * 8); |
| 822 lfeon = get_bits(&bits, 1); | 836 lfeon = get_bits(&bits, 1); |
| 823 | 837 |
| 824 *sample_rate = ac3_sample_rates[fscod]; | 838 *sample_rate = ac3_sample_rates[fscod]; |
| 825 *bit_rate = ac3_bitrates[frmsizecod] * 1000; | 839 *bit_rate = ac3_bitrates[frmsizecod] * 1000; |
| 826 *channels = ac3_channels[acmod] + lfeon; | 840 *channels = ac3_channels[acmod] + lfeon; |
| 841 *samples = 6 * 256; | |
| 827 | 842 |
| 828 return ac3_frame_sizes[frmsizecod][fscod] * 2; | 843 return ac3_frame_sizes[frmsizecod][fscod] * 2; |
| 844 } | |
| 845 | |
| 846 static int aac_sync(const uint8_t *buf, int *channels, int *sample_rate, | |
| 847 int *bit_rate, int *samples) | |
| 848 { | |
| 849 GetBitContext bits; | |
| 850 int size, rdb, ch, sr; | |
| 851 | |
| 852 init_get_bits(&bits, buf, AAC_HEADER_SIZE * 8); | |
| 853 | |
| 854 if(get_bits(&bits, 12) != 0xfff) | |
| 855 return 0; | |
| 856 | |
| 857 get_bits(&bits, 1); | |
| 858 get_bits(&bits, 2); | |
| 859 get_bits(&bits, 1); /* protection_absent */ | |
| 860 get_bits(&bits, 2); | |
| 861 sr = get_bits(&bits, 4); | |
| 862 if(!aac_sample_rates[sr]) | |
| 863 return 0; | |
| 864 get_bits(&bits, 1); /* private_bit */ | |
| 865 ch = get_bits(&bits, 3); | |
| 866 if(!aac_channels[ch]) | |
| 867 return 0; | |
| 868 get_bits(&bits, 1); /* original/copy */ | |
| 869 get_bits(&bits, 1); /* home */ | |
| 870 | |
| 871 /* adts_variable_header */ | |
| 872 get_bits(&bits, 1); /* copyright_identification_bit */ | |
| 873 get_bits(&bits, 1); /* copyright_identification_start */ | |
| 874 size = get_bits(&bits, 13); | |
| 875 get_bits(&bits, 11); /* adts_buffer_fullness */ | |
| 876 rdb = get_bits(&bits, 2); | |
| 877 | |
| 878 *channels = aac_channels[ch]; | |
| 879 *sample_rate = aac_sample_rates[sr]; | |
| 880 *samples = (rdb + 1) * 1024; | |
| 881 *bit_rate = size * 8 * *sample_rate / *samples; | |
| 882 | |
| 883 return size; | |
| 829 } | 884 } |
| 830 | 885 |
| 831 static int ac3_parse_init(AVCodecParserContext *s1) | 886 static int ac3_parse_init(AVCodecParserContext *s1) |
| 832 { | 887 { |
| 833 AC3ParseContext *s = s1->priv_data; | 888 AC3ParseContext *s = s1->priv_data; |
| 834 s->inbuf_ptr = s->inbuf; | 889 s->inbuf_ptr = s->inbuf; |
| 890 s->header_size = AC3_HEADER_SIZE; | |
| 891 s->sync = ac3_sync; | |
| 835 return 0; | 892 return 0; |
| 836 } | 893 } |
| 837 | 894 |
| 895 static int aac_parse_init(AVCodecParserContext *s1) | |
| 896 { | |
| 897 AC3ParseContext *s = s1->priv_data; | |
| 898 s->inbuf_ptr = s->inbuf; | |
| 899 s->header_size = AAC_HEADER_SIZE; | |
| 900 s->sync = aac_sync; | |
| 901 return 0; | |
| 902 } | |
| 903 | |
| 904 /* also used for ADTS AAC */ | |
| 838 static int ac3_parse(AVCodecParserContext *s1, | 905 static int ac3_parse(AVCodecParserContext *s1, |
| 839 AVCodecContext *avctx, | 906 AVCodecContext *avctx, |
| 840 uint8_t **poutbuf, int *poutbuf_size, | 907 uint8_t **poutbuf, int *poutbuf_size, |
| 841 const uint8_t *buf, int buf_size) | 908 const uint8_t *buf, int buf_size) |
| 842 { | 909 { |
| 843 AC3ParseContext *s = s1->priv_data; | 910 AC3ParseContext *s = s1->priv_data; |
| 844 const uint8_t *buf_ptr; | 911 const uint8_t *buf_ptr; |
| 845 int len, sample_rate, bit_rate, channels; | 912 int len, sample_rate, bit_rate, channels, samples; |
| 846 | 913 |
| 847 *poutbuf = NULL; | 914 *poutbuf = NULL; |
| 848 *poutbuf_size = 0; | 915 *poutbuf_size = 0; |
| 849 | 916 |
| 850 buf_ptr = buf; | 917 buf_ptr = buf; |
| 851 while (buf_size > 0) { | 918 while (buf_size > 0) { |
| 852 len = s->inbuf_ptr - s->inbuf; | 919 len = s->inbuf_ptr - s->inbuf; |
| 853 if (s->frame_size == 0) { | 920 if (s->frame_size == 0) { |
| 854 /* no header seen : find one. We need at least 7 bytes to parse it */ | 921 /* no header seen : find one. We need at least s->header_size |
| 855 len = FFMIN(AC3_HEADER_SIZE - len, buf_size); | 922 bytes to parse it */ |
| 923 len = FFMIN(s->header_size - len, buf_size); | |
| 856 | 924 |
| 857 memcpy(s->inbuf_ptr, buf_ptr, len); | 925 memcpy(s->inbuf_ptr, buf_ptr, len); |
| 858 buf_ptr += len; | 926 buf_ptr += len; |
| 859 s->inbuf_ptr += len; | 927 s->inbuf_ptr += len; |
| 860 buf_size -= len; | 928 buf_size -= len; |
| 861 if ((s->inbuf_ptr - s->inbuf) == AC3_HEADER_SIZE) { | 929 if ((s->inbuf_ptr - s->inbuf) == s->header_size) { |
| 862 len = ac3_sync(s->inbuf, &channels, &sample_rate, &bit_rate); | 930 len = s->sync(s->inbuf, &channels, &sample_rate, &bit_rate, |
| 931 &samples); | |
| 863 if (len == 0) { | 932 if (len == 0) { |
| 864 /* no sync found : move by one byte (inefficient, but simple!) */ | 933 /* no sync found : move by one byte (inefficient, but simple!) */ |
| 865 memmove(s->inbuf, s->inbuf + 1, AC3_HEADER_SIZE - 1); | 934 memmove(s->inbuf, s->inbuf + 1, s->header_size - 1); |
| 866 s->inbuf_ptr--; | 935 s->inbuf_ptr--; |
| 867 } else { | 936 } else { |
| 868 s->frame_size = len; | 937 s->frame_size = len; |
| 869 /* update codec info */ | 938 /* update codec info */ |
| 870 avctx->sample_rate = sample_rate; | 939 avctx->sample_rate = sample_rate; |
| 871 /* set channels,except if the user explicitly requests 1 or 2 channels, XXX/FIXME this is a bit ugly */ | 940 /* set channels,except if the user explicitly requests 1 or 2 channels, XXX/FIXME this is a bit ugly */ |
| 872 if(avctx->channels!=1 && avctx->channels!=2){ | 941 if(avctx->codec_id == CODEC_ID_AC3){ |
| 942 if(avctx->channels!=1 && avctx->channels!=2){ | |
| 943 avctx->channels = channels; | |
| 944 } | |
| 945 } else { | |
| 873 avctx->channels = channels; | 946 avctx->channels = channels; |
| 874 } | 947 } |
| 875 avctx->bit_rate = bit_rate; | 948 avctx->bit_rate = bit_rate; |
| 876 avctx->frame_size = 6 * 256; | 949 avctx->frame_size = samples; |
| 877 } | 950 } |
| 878 } | 951 } |
| 879 } else { | 952 } else { |
| 880 len = FFMIN(s->frame_size - len, buf_size); | 953 len = FFMIN(s->frame_size - len, buf_size); |
| 881 | 954 |
| 927 sizeof(AC3ParseContext), | 1000 sizeof(AC3ParseContext), |
| 928 ac3_parse_init, | 1001 ac3_parse_init, |
| 929 ac3_parse, | 1002 ac3_parse, |
| 930 NULL, | 1003 NULL, |
| 931 }; | 1004 }; |
| 1005 | |
| 1006 AVCodecParser aac_parser = { | |
| 1007 { CODEC_ID_AAC }, | |
| 1008 sizeof(AC3ParseContext), | |
| 1009 aac_parse_init, | |
| 1010 ac3_parse, | |
| 1011 NULL, | |
| 1012 }; |
