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);