comparison ogg2.c @ 1132:a5487f44bbfa libavformat

cleaned up buffer management
author mru
date Sun, 25 Jun 2006 00:41:13 +0000
parents 801d4a5cf353
children 554cc16341da
comparison
equal deleted inserted replaced
1131:a9f78ea5c6a3 1132:a5487f44bbfa
191 ogg->nstreams * sizeof (*ogg->streams)); 191 ogg->nstreams * sizeof (*ogg->streams));
192 memset (ogg->streams + idx, 0, sizeof (*ogg->streams)); 192 memset (ogg->streams + idx, 0, sizeof (*ogg->streams));
193 os = ogg->streams + idx; 193 os = ogg->streams + idx;
194 os->serial = serial; 194 os->serial = serial;
195 os->bufsize = DECODER_BUFFER_SIZE; 195 os->bufsize = DECODER_BUFFER_SIZE;
196 os->buf = av_malloc (os->bufsize);
197 memset (os->buf, 0, os->bufsize);
198 os->header = -1; 196 os->header = -1;
199 197
200 st = av_new_stream (s, idx); 198 st = av_new_stream (s, idx);
201 if (!st) 199 if (!st)
202 return AVERROR_NOMEM; 200 return AVERROR_NOMEM;
203 201
204 av_set_pts_info(st, 64, 1, 1000000); 202 av_set_pts_info(st, 64, 1, 1000000);
205 st->start_time = 0; 203 st->start_time = 0;
206 204
207 return idx; 205 return idx;
206 }
207
208 static int
209 ogg_new_buf(ogg_t *ogg, int idx)
210 {
211 ogg_stream_t *os = ogg->streams + idx;
212 u_char *nb = av_malloc(os->bufsize);
213 int size = os->bufpos - os->pstart;
214 if(os->buf){
215 memcpy(nb, os->buf + os->pstart, size);
216 av_free(os->buf);
217 }
218 os->buf = nb;
219 os->bufpos = size;
220 os->pstart = 0;
221
222 return 0;
208 } 223 }
209 224
210 static int 225 static int
211 ogg_read_page (AVFormatContext * s, int *str) 226 ogg_read_page (AVFormatContext * s, int *str)
212 { 227 {
262 return -1; 277 return -1;
263 } 278 }
264 279
265 os = ogg->streams + idx; 280 os = ogg->streams + idx;
266 281
282 if(os->segp == os->nsegs)
283 ogg_new_buf(ogg, idx);
284
267 if (get_buffer (bc, os->segments, nsegs) < nsegs) 285 if (get_buffer (bc, os->segments, nsegs) < nsegs)
268 return -1; 286 return -1;
269 287
270 os->nsegs = nsegs; 288 os->nsegs = nsegs;
271 os->segp = 0; 289 os->segp = 0;
308 326
309 return 0; 327 return 0;
310 } 328 }
311 329
312 static int 330 static int
313 ogg_packet (AVFormatContext * s, int *str) 331 ogg_packet (AVFormatContext * s, int *str, int *dstart, int *dsize)
314 { 332 {
315 ogg_t *ogg = s->priv_data; 333 ogg_t *ogg = s->priv_data;
316 int idx; 334 int idx;
317 ogg_stream_t *os; 335 ogg_stream_t *os;
318 int complete = 0; 336 int complete = 0;
361 break; 379 break;
362 } 380 }
363 } 381 }
364 382
365 if (!complete && os->segp == os->nsegs){ 383 if (!complete && os->segp == os->nsegs){
366 uint8_t *nb = av_malloc (os->bufsize);
367 int size = os->bufpos - os->pstart;
368 memset (nb, 0, os->bufsize);
369 memcpy (nb, os->buf + os->pstart, size);
370 av_free (os->buf);
371 os->buf = nb;
372 os->bufpos = size;
373 os->pstart = 0;
374 ogg->curidx = -1; 384 ogg->curidx = -1;
375 } 385 }
376 }while (!complete); 386 }while (!complete);
377 387
378 #if 0 388 #if 0
399 if (os->header > -1 && os->seq > os->header){ 409 if (os->header > -1 && os->seq > os->header){
400 if (os->codec && os->codec->packet) 410 if (os->codec && os->codec->packet)
401 os->codec->packet (s, idx); 411 os->codec->packet (s, idx);
402 if (str) 412 if (str)
403 *str = idx; 413 *str = idx;
414 if (dstart)
415 *dstart = os->pstart;
416 if (dsize)
417 *dsize = os->psize;
418 os->pstart += os->psize;
419 os->psize = 0;
404 } 420 }
405 421
406 os->seq++; 422 os->seq++;
407 if (os->segp == os->nsegs) 423 if (os->segp == os->nsegs)
408 ogg->curidx = -1; 424 ogg->curidx = -1;
414 ogg_get_headers (AVFormatContext * s) 430 ogg_get_headers (AVFormatContext * s)
415 { 431 {
416 ogg_t *ogg = s->priv_data; 432 ogg_t *ogg = s->priv_data;
417 433
418 do{ 434 do{
419 if (ogg_packet (s, NULL) < 0) 435 if (ogg_packet (s, NULL, NULL, NULL) < 0)
420 return -1; 436 return -1;
421 }while (!ogg->headers); 437 }while (!ogg->headers);
422 438
423 #if 0 439 #if 0
424 av_log (s, AV_LOG_DEBUG, "found headers\n"); 440 av_log (s, AV_LOG_DEBUG, "found headers\n");
505 ogg_read_packet (AVFormatContext * s, AVPacket * pkt) 521 ogg_read_packet (AVFormatContext * s, AVPacket * pkt)
506 { 522 {
507 ogg_t *ogg; 523 ogg_t *ogg;
508 ogg_stream_t *os; 524 ogg_stream_t *os;
509 int idx = -1; 525 int idx = -1;
526 int pstart, psize;
510 527
511 //Get an ogg packet 528 //Get an ogg packet
512 do{ 529 do{
513 if (ogg_packet (s, &idx) < 0) 530 if (ogg_packet (s, &idx, &pstart, &psize) < 0)
514 return AVERROR_IO; 531 return AVERROR_IO;
515 }while (idx < 0 || !s->streams[idx]); 532 }while (idx < 0 || !s->streams[idx]);
516 533
517 ogg = s->priv_data; 534 ogg = s->priv_data;
518 os = ogg->streams + idx; 535 os = ogg->streams + idx;
519 536
520 //Alloc a pkt 537 //Alloc a pkt
521 if (av_new_packet (pkt, os->psize) < 0) 538 if (av_new_packet (pkt, psize) < 0)
522 return AVERROR_IO; 539 return AVERROR_IO;
523 pkt->stream_index = idx; 540 pkt->stream_index = idx;
524 memcpy (pkt->data, os->buf + os->pstart, os->psize); 541 memcpy (pkt->data, os->buf + pstart, psize);
525 if (os->lastgp != -1LL){ 542 if (os->lastgp != -1LL){
526 pkt->pts = ogg_gptopts (s, idx, os->lastgp); 543 pkt->pts = ogg_gptopts (s, idx, os->lastgp);
527 os->lastgp = -1; 544 os->lastgp = -1;
528 } 545 }
529 //next 546
530 os->pstart += os->psize; 547 return psize;
531 os->psize = 0;
532 return os->psize;
533 } 548 }
534 549
535 550
536 static int 551 static int
537 ogg_read_close (AVFormatContext * s) 552 ogg_read_close (AVFormatContext * s)