comparison utils.c @ 1214:327c5a36dfe7 libavcodec

fixing mixed dr1 + internal buffers
author michaelni
date Fri, 25 Apr 2003 00:29:48 +0000
parents e0fc95a6eb4e
children eb2affe57a2a
comparison
equal deleted inserted replaced
1213:a71fe70b428b 1214:327c5a36dfe7
117 while (*p != NULL) p = &(*p)->next; 117 while (*p != NULL) p = &(*p)->next;
118 *p = format; 118 *p = format;
119 format->next = NULL; 119 format->next = NULL;
120 } 120 }
121 121
122 typedef struct DefaultPicOpaque{ 122 typedef struct InternalBuffer{
123 int last_pic_num; 123 int last_pic_num;
124 uint8_t *base[4];
124 uint8_t *data[4]; 125 uint8_t *data[4];
125 }DefaultPicOpaque; 126 }InternalBuffer;
127
128 #define INTERNAL_BUFFER_SIZE 32
126 129
127 int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ 130 int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){
128 int i; 131 int i;
129 const int width = s->width; 132 const int width = s->width;
130 const int height= s->height; 133 const int height= s->height;
131 DefaultPicOpaque *opaque; 134 InternalBuffer *buf;
132 135
133 assert(pic->data[0]==NULL); 136 assert(pic->data[0]==NULL);
134 assert(pic->type==0 || pic->type==FF_BUFFER_TYPE_INTERNAL); 137 assert(INTERNAL_BUFFER_SIZE > s->internal_buffer_count);
135 138
136 if(pic->opaque){ 139 if(s->internal_buffer==NULL){
137 opaque= (DefaultPicOpaque *)pic->opaque; 140 s->internal_buffer= av_mallocz(INTERNAL_BUFFER_SIZE*sizeof(InternalBuffer));
138 for(i=0; i<3; i++) 141 }
139 pic->data[i]= opaque->data[i]; 142 #if 0
140 143 s->internal_buffer= av_fast_realloc(
141 // printf("get_buffer %X coded_pic_num:%d last:%d\n", pic->opaque, pic->coded_picture_number, opaque->last_pic_num); 144 s->internal_buffer,
142 pic->age= pic->coded_picture_number - opaque->last_pic_num; 145 &s->internal_buffer_size,
143 opaque->last_pic_num= pic->coded_picture_number; 146 sizeof(InternalBuffer)*FFMAX(99, s->internal_buffer_count+1)/*FIXME*/
144 //printf("age: %d %d %d\n", pic->age, c->picture_number, pic->coded_picture_number); 147 );
148 #endif
149
150 buf= &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count];
151
152 if(buf->base[0]){
153 pic->age= pic->coded_picture_number - buf->last_pic_num;
154 buf->last_pic_num= pic->coded_picture_number;
145 }else{ 155 }else{
146 int align, h_chroma_shift, v_chroma_shift; 156 int align, h_chroma_shift, v_chroma_shift;
147 int w, h, pixel_size; 157 int w, h, pixel_size;
148 158
149 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift); 159 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
172 if(!(s->flags&CODEC_FLAG_EMU_EDGE)){ 182 if(!(s->flags&CODEC_FLAG_EMU_EDGE)){
173 w+= EDGE_WIDTH*2; 183 w+= EDGE_WIDTH*2;
174 h+= EDGE_WIDTH*2; 184 h+= EDGE_WIDTH*2;
175 } 185 }
176 186
177 opaque= av_mallocz(sizeof(DefaultPicOpaque)); 187 buf->last_pic_num= -256*256*256*64;
178 if(opaque==NULL) return -1;
179
180 pic->opaque= opaque;
181 opaque->last_pic_num= -256*256*256*64;
182 188
183 for(i=0; i<3; i++){ 189 for(i=0; i<3; i++){
184 const int h_shift= i==0 ? 0 : h_chroma_shift; 190 const int h_shift= i==0 ? 0 : h_chroma_shift;
185 const int v_shift= i==0 ? 0 : v_chroma_shift; 191 const int v_shift= i==0 ? 0 : v_chroma_shift;
186 192
187 pic->linesize[i]= pixel_size*w>>h_shift; 193 pic->linesize[i]= pixel_size*w>>h_shift;
188 194
189 pic->base[i]= av_mallocz((pic->linesize[i]*h>>v_shift)+16); //FIXME 16 195 buf->base[i]= av_mallocz((pic->linesize[i]*h>>v_shift)+16); //FIXME 16
190 if(pic->base[i]==NULL) return -1; 196 if(buf->base[i]==NULL) return -1;
191 197 memset(buf->base[i], 128, pic->linesize[i]*h>>v_shift);
192 memset(pic->base[i], 128, pic->linesize[i]*h>>v_shift);
193 198
194 if(s->flags&CODEC_FLAG_EMU_EDGE) 199 if(s->flags&CODEC_FLAG_EMU_EDGE)
195 pic->data[i] = pic->base[i]; 200 buf->data[i] = buf->base[i];
196 else 201 else
197 pic->data[i] = pic->base[i] + (pic->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift); 202 buf->data[i] = buf->base[i] + (pic->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift);
198
199 opaque->data[i]= pic->data[i];
200 } 203 }
201 pic->age= 256*256*256*64; 204 pic->age= 256*256*256*64;
202 pic->type= FF_BUFFER_TYPE_INTERNAL; 205 pic->type= FF_BUFFER_TYPE_INTERNAL;
203 } 206 }
204 207
208 for(i=0; i<4; i++){
209 pic->base[i]= buf->base[i];
210 pic->data[i]= buf->data[i];
211 }
212 s->internal_buffer_count++;
213
205 return 0; 214 return 0;
206 } 215 }
207 216
208 void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic){ 217 void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic){
209 int i; 218 int i;
210 219 InternalBuffer *buf, *last, temp;
220
211 assert(pic->type==FF_BUFFER_TYPE_INTERNAL); 221 assert(pic->type==FF_BUFFER_TYPE_INTERNAL);
212 222
213 for(i=0; i<3; i++) 223 for(i=0; i<s->internal_buffer_count; i++){ //just 3-5 checks so is not worth to optimize
224 buf= &((InternalBuffer*)s->internal_buffer)[i];
225 if(buf->data[0] == pic->data[0])
226 break;
227 }
228 assert(i < s->internal_buffer_count);
229 s->internal_buffer_count--;
230 last = &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count];
231
232 temp= *buf;
233 *buf= *last;
234 *last= temp;
235
236 for(i=0; i<3; i++){
214 pic->data[i]=NULL; 237 pic->data[i]=NULL;
238 // pic->base[i]=NULL;
239 }
215 //printf("R%X\n", pic->opaque); 240 //printf("R%X\n", pic->opaque);
216 } 241 }
217 242
218 enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, enum PixelFormat * fmt){ 243 enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, enum PixelFormat * fmt){
219 return fmt[0]; 244 return fmt[0];
590 //FIXME 615 //FIXME
591 break; 616 break;
592 } 617 }
593 } 618 }
594 619
620 void avcodec_default_free_buffers(AVCodecContext *s){
621 int i, j;
622
623 if(s->internal_buffer==NULL) return;
624
625 for(i=0; i<INTERNAL_BUFFER_SIZE; i++){
626 InternalBuffer *buf= &((InternalBuffer*)s->internal_buffer)[i];
627 for(j=0; j<4; j++){
628 av_freep(&buf->base[j]);
629 buf->data[j]= NULL;
630 }
631 }
632 av_freep(&s->internal_buffer);
633
634 s->internal_buffer_count=0;
635 }
636
595 int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max){ 637 int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max){
596 int exact=1, sign=0; 638 int exact=1, sign=0;
597 int64_t gcd, larger; 639 int64_t gcd, larger;
598 640
599 assert(den != 0); 641 assert(den != 0);