Mercurial > libavformat.hg
comparison ffm.c @ 2771:d52c718e83f9 libavformat
Use dynamically allocated ByteIOContext in AVFormatContext
patch by: Bj«Órn Axelsson, bjorn d axelsson a intinor d se
thread: [PATCH] Remove static ByteIOContexts, 06 nov 2007
author | andoma |
---|---|
date | Wed, 21 Nov 2007 07:41:00 +0000 |
parents | 3427d0c63a32 |
children | 75d64cb5ee6c |
comparison
equal
deleted
inserted
replaced
2770:a7e42cf4b364 | 2771:d52c718e83f9 |
---|---|
62 #ifdef CONFIG_MUXERS | 62 #ifdef CONFIG_MUXERS |
63 static void flush_packet(AVFormatContext *s) | 63 static void flush_packet(AVFormatContext *s) |
64 { | 64 { |
65 FFMContext *ffm = s->priv_data; | 65 FFMContext *ffm = s->priv_data; |
66 int fill_size, h; | 66 int fill_size, h; |
67 ByteIOContext *pb = &s->pb; | 67 ByteIOContext *pb = s->pb; |
68 | 68 |
69 fill_size = ffm->packet_end - ffm->packet_ptr; | 69 fill_size = ffm->packet_end - ffm->packet_ptr; |
70 memset(ffm->packet_ptr, 0, fill_size); | 70 memset(ffm->packet_ptr, 0, fill_size); |
71 | 71 |
72 if (url_ftell(pb) % ffm->packet_size) | 72 if (url_ftell(pb) % ffm->packet_size) |
126 static int ffm_write_header(AVFormatContext *s) | 126 static int ffm_write_header(AVFormatContext *s) |
127 { | 127 { |
128 FFMContext *ffm = s->priv_data; | 128 FFMContext *ffm = s->priv_data; |
129 AVStream *st; | 129 AVStream *st; |
130 FFMStream *fst; | 130 FFMStream *fst; |
131 ByteIOContext *pb = &s->pb; | 131 ByteIOContext *pb = s->pb; |
132 AVCodecContext *codec; | 132 AVCodecContext *codec; |
133 int bit_rate, i; | 133 int bit_rate, i; |
134 | 134 |
135 ffm->packet_size = FFM_PACKET_SIZE; | 135 ffm->packet_size = FFM_PACKET_SIZE; |
136 | 136 |
276 return 0; | 276 return 0; |
277 } | 277 } |
278 | 278 |
279 static int ffm_write_trailer(AVFormatContext *s) | 279 static int ffm_write_trailer(AVFormatContext *s) |
280 { | 280 { |
281 ByteIOContext *pb = &s->pb; | 281 ByteIOContext *pb = s->pb; |
282 FFMContext *ffm = s->priv_data; | 282 FFMContext *ffm = s->priv_data; |
283 | 283 |
284 /* flush packets */ | 284 /* flush packets */ |
285 if (ffm->packet_ptr > ffm->packet) | 285 if (ffm->packet_ptr > ffm->packet) |
286 flush_packet(s); | 286 flush_packet(s); |
312 if (!ffm_nopts) { | 312 if (!ffm_nopts) { |
313 /* XXX: I don't understand this test, so I disabled it for testing */ | 313 /* XXX: I don't understand this test, so I disabled it for testing */ |
314 if (size <= len) | 314 if (size <= len) |
315 return 1; | 315 return 1; |
316 } | 316 } |
317 pos = url_ftell(&s->pb); | 317 pos = url_ftell(s->pb); |
318 if (pos == ffm->write_index) { | 318 if (pos == ffm->write_index) { |
319 /* exactly at the end of stream */ | 319 /* exactly at the end of stream */ |
320 return 0; | 320 return 0; |
321 } else if (pos < ffm->write_index) { | 321 } else if (pos < ffm->write_index) { |
322 avail_size = ffm->write_index - pos; | 322 avail_size = ffm->write_index - pos; |
333 /* first is true if we read the frame header */ | 333 /* first is true if we read the frame header */ |
334 static int ffm_read_data(AVFormatContext *s, | 334 static int ffm_read_data(AVFormatContext *s, |
335 uint8_t *buf, int size, int first) | 335 uint8_t *buf, int size, int first) |
336 { | 336 { |
337 FFMContext *ffm = s->priv_data; | 337 FFMContext *ffm = s->priv_data; |
338 ByteIOContext *pb = &s->pb; | 338 ByteIOContext *pb = s->pb; |
339 int len, fill_size, size1, frame_offset; | 339 int len, fill_size, size1, frame_offset; |
340 | 340 |
341 size1 = size; | 341 size1 = size; |
342 while (size > 0) { | 342 while (size > 0) { |
343 redo: | 343 redo: |
391 | 391 |
392 | 392 |
393 static void adjust_write_index(AVFormatContext *s) | 393 static void adjust_write_index(AVFormatContext *s) |
394 { | 394 { |
395 FFMContext *ffm = s->priv_data; | 395 FFMContext *ffm = s->priv_data; |
396 ByteIOContext *pb = &s->pb; | 396 ByteIOContext *pb = s->pb; |
397 int64_t pts; | 397 int64_t pts; |
398 //offset_t orig_write_index = ffm->write_index; | 398 //offset_t orig_write_index = ffm->write_index; |
399 offset_t pos_min, pos_max; | 399 offset_t pos_min, pos_max; |
400 int64_t pts_start; | 400 int64_t pts_start; |
401 offset_t ptr = url_ftell(pb); | 401 offset_t ptr = url_ftell(pb); |
450 static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap) | 450 static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap) |
451 { | 451 { |
452 FFMContext *ffm = s->priv_data; | 452 FFMContext *ffm = s->priv_data; |
453 AVStream *st; | 453 AVStream *st; |
454 FFMStream *fst; | 454 FFMStream *fst; |
455 ByteIOContext *pb = &s->pb; | 455 ByteIOContext *pb = s->pb; |
456 AVCodecContext *codec; | 456 AVCodecContext *codec; |
457 int i, nb_streams; | 457 int i, nb_streams; |
458 uint32_t tag; | 458 uint32_t tag; |
459 | 459 |
460 /* header */ | 460 /* header */ |
583 if (!ffm_is_avail_data(s, FRAME_HEADER_SIZE)) { | 583 if (!ffm_is_avail_data(s, FRAME_HEADER_SIZE)) { |
584 return AVERROR(EAGAIN); | 584 return AVERROR(EAGAIN); |
585 } | 585 } |
586 #if 0 | 586 #if 0 |
587 printf("pos=%08"PRIx64" spos=%"PRIx64", write_index=%"PRIx64" size=%"PRIx64"\n", | 587 printf("pos=%08"PRIx64" spos=%"PRIx64", write_index=%"PRIx64" size=%"PRIx64"\n", |
588 url_ftell(&s->pb), s->pb.pos, ffm->write_index, ffm->file_size); | 588 url_ftell(s->pb), s->pb.pos, ffm->write_index, ffm->file_size); |
589 #endif | 589 #endif |
590 if (ffm_read_data(s, ffm->header, FRAME_HEADER_SIZE, 1) != | 590 if (ffm_read_data(s, ffm->header, FRAME_HEADER_SIZE, 1) != |
591 FRAME_HEADER_SIZE) | 591 FRAME_HEADER_SIZE) |
592 return AVERROR(EAGAIN); | 592 return AVERROR(EAGAIN); |
593 #if 0 | 593 #if 0 |
608 | 608 |
609 duration = AV_RB24(ffm->header + 5); | 609 duration = AV_RB24(ffm->header + 5); |
610 | 610 |
611 av_new_packet(pkt, size); | 611 av_new_packet(pkt, size); |
612 pkt->stream_index = ffm->header[0]; | 612 pkt->stream_index = ffm->header[0]; |
613 pkt->pos = url_ftell(&s->pb); | 613 pkt->pos = url_ftell(s->pb); |
614 if (ffm->header[1] & FLAG_KEY_FRAME) | 614 if (ffm->header[1] & FLAG_KEY_FRAME) |
615 pkt->flags |= PKT_FLAG_KEY; | 615 pkt->flags |= PKT_FLAG_KEY; |
616 | 616 |
617 ffm->read_state = READ_HEADER; | 617 ffm->read_state = READ_HEADER; |
618 if (ffm_read_data(s, pkt->data, size, 0) != size) { | 618 if (ffm_read_data(s, pkt->data, size, 0) != size) { |
636 /* pos is between 0 and file_size - FFM_PACKET_SIZE. It is translated | 636 /* pos is between 0 and file_size - FFM_PACKET_SIZE. It is translated |
637 by the write position inside this function */ | 637 by the write position inside this function */ |
638 static void ffm_seek1(AVFormatContext *s, offset_t pos1) | 638 static void ffm_seek1(AVFormatContext *s, offset_t pos1) |
639 { | 639 { |
640 FFMContext *ffm = s->priv_data; | 640 FFMContext *ffm = s->priv_data; |
641 ByteIOContext *pb = &s->pb; | 641 ByteIOContext *pb = s->pb; |
642 offset_t pos; | 642 offset_t pos; |
643 | 643 |
644 pos = pos1 + ffm->write_index; | 644 pos = pos1 + ffm->write_index; |
645 if (pos >= ffm->file_size) | 645 if (pos >= ffm->file_size) |
646 pos -= (ffm->file_size - FFM_PACKET_SIZE); | 646 pos -= (ffm->file_size - FFM_PACKET_SIZE); |
650 url_fseek(pb, pos, SEEK_SET); | 650 url_fseek(pb, pos, SEEK_SET); |
651 } | 651 } |
652 | 652 |
653 static int64_t get_pts(AVFormatContext *s, offset_t pos) | 653 static int64_t get_pts(AVFormatContext *s, offset_t pos) |
654 { | 654 { |
655 ByteIOContext *pb = &s->pb; | 655 ByteIOContext *pb = s->pb; |
656 int64_t pts; | 656 int64_t pts; |
657 | 657 |
658 ffm_seek1(s, pos); | 658 ffm_seek1(s, pos); |
659 url_fskip(pb, 4); | 659 url_fskip(pb, 4); |
660 pts = get_be64(pb); | 660 pts = get_be64(pb); |