Mercurial > libavcodec.hg
comparison vorbis.c @ 4722:7595ead28402 libavcodec
extract vorbis header spliting code into a reusable function
Original thread:
Date: Thu, 22 Mar 2007 20:23:08 -0400
Subject: [Ffmpeg-devel] [PATCH] Theora in MKV (GSoC '07 Qualification)
author | aurel |
---|---|
date | Sun, 25 Mar 2007 01:06:45 +0000 |
parents | 8535fcac43c1 |
children | cb647e7b4b8b |
comparison
equal
deleted
inserted
replaced
4721:3e15e577ca32 | 4722:7595ead28402 |
---|---|
31 #include "avcodec.h" | 31 #include "avcodec.h" |
32 #include "bitstream.h" | 32 #include "bitstream.h" |
33 #include "dsputil.h" | 33 #include "dsputil.h" |
34 | 34 |
35 #include "vorbis.h" | 35 #include "vorbis.h" |
36 #include "xiph.h" | |
36 | 37 |
37 #define V_NB_BITS 8 | 38 #define V_NB_BITS 8 |
38 #define V_NB_BITS2 11 | 39 #define V_NB_BITS2 11 |
39 #define V_MAX_VLCS (1<<16) | 40 #define V_MAX_VLCS (1<<16) |
40 | 41 |
1037 uint8_t *headers = avccontext->extradata; | 1038 uint8_t *headers = avccontext->extradata; |
1038 int headers_len=avccontext->extradata_size; | 1039 int headers_len=avccontext->extradata_size; |
1039 uint8_t *header_start[3]; | 1040 uint8_t *header_start[3]; |
1040 int header_len[3]; | 1041 int header_len[3]; |
1041 GetBitContext *gb = &(vc->gb); | 1042 GetBitContext *gb = &(vc->gb); |
1042 int i, j, hdr_type; | 1043 int hdr_type; |
1043 | 1044 |
1044 vc->avccontext = avccontext; | 1045 vc->avccontext = avccontext; |
1045 dsputil_init(&vc->dsp, avccontext); | 1046 dsputil_init(&vc->dsp, avccontext); |
1046 | 1047 |
1047 if(vc->dsp.float_to_int16 == ff_float_to_int16_c) { | 1048 if(vc->dsp.float_to_int16 == ff_float_to_int16_c) { |
1055 if (!headers_len) { | 1056 if (!headers_len) { |
1056 av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n"); | 1057 av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n"); |
1057 return -1; | 1058 return -1; |
1058 } | 1059 } |
1059 | 1060 |
1060 if(headers[0] == 0 && headers[1] == 30) { | 1061 if (ff_split_xiph_headers(headers, headers_len, 30, header_start, header_len) < 0) { |
1061 for(i = 0; i < 3; i++){ | |
1062 header_len[i] = *headers++ << 8; | |
1063 header_len[i] += *headers++; | |
1064 header_start[i] = headers; | |
1065 headers += header_len[i]; | |
1066 } | |
1067 } else if(headers[0] == 2) { | |
1068 for(j=1,i=0;i<2;++i, ++j) { | |
1069 header_len[i]=0; | |
1070 while(j<headers_len && headers[j]==0xff) { | |
1071 header_len[i]+=0xff; | |
1072 ++j; | |
1073 } | |
1074 if (j>=headers_len) { | |
1075 av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n"); | |
1076 return -1; | |
1077 } | |
1078 header_len[i]+=headers[j]; | |
1079 } | |
1080 header_len[2]=headers_len-header_len[0]-header_len[1]-j; | |
1081 headers+=j; | |
1082 header_start[0] = headers; | |
1083 header_start[1] = header_start[0] + header_len[0]; | |
1084 header_start[2] = header_start[1] + header_len[1]; | |
1085 } else { | |
1086 av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n"); | 1062 av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n"); |
1087 return -1; | 1063 return -1; |
1088 } | 1064 } |
1089 | 1065 |
1090 init_get_bits(gb, header_start[0], header_len[0]*8); | 1066 init_get_bits(gb, header_start[0], header_len[0]*8); |