Mercurial > libavformat.hg
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) |