Mercurial > libavformat.hg
comparison gxfenc.c @ 4329:bd49910ad4a0 libavformat
use st->priv_data to store per stream context
author | bcoudurier |
---|---|
date | Sat, 31 Jan 2009 11:06:20 +0000 |
parents | 8880764c2012 |
children | 880838781e34 |
comparison
equal
deleted
inserted
replaced
4328:fb0fde31327a | 4329:bd49910ad4a0 |
---|---|
64 uint16_t umf_media_size; | 64 uint16_t umf_media_size; |
65 int audio_written; | 65 int audio_written; |
66 int sample_rate; | 66 int sample_rate; |
67 int flags; | 67 int flags; |
68 AVFormatContext *fc; | 68 AVFormatContext *fc; |
69 GXFStreamContext streams[48]; | |
70 } GXFContext; | 69 } GXFContext; |
71 | 70 |
72 typedef struct GXF_Lines { | 71 typedef struct GXF_Lines { |
73 int height; | 72 int height; |
74 int index; | 73 int index; |
318 int i; | 317 int i; |
319 | 318 |
320 pos = url_ftell(pb); | 319 pos = url_ftell(pb); |
321 put_be16(pb, 0); /* size */ | 320 put_be16(pb, 0); /* size */ |
322 for (i = 0; i < ctx->fc->nb_streams; ++i) | 321 for (i = 0; i < ctx->fc->nb_streams; ++i) |
323 gxf_write_track_description(pb, &ctx->streams[i]); | 322 gxf_write_track_description(pb, ctx->fc->streams[i]->priv_data); |
324 return updateSize(pb, pos); | 323 return updateSize(pb, pos); |
325 } | 324 } |
326 | 325 |
327 static int gxf_write_map_packet(ByteIOContext *pb, GXFContext *ctx) | 326 static int gxf_write_map_packet(ByteIOContext *pb, GXFContext *ctx) |
328 { | 327 { |
409 int i; | 408 int i; |
410 | 409 |
411 ctx->umf_track_offset = pos - ctx->umf_start_offset; | 410 ctx->umf_track_offset = pos - ctx->umf_start_offset; |
412 for (i = 0; i < ctx->fc->nb_streams; ++i) { | 411 for (i = 0; i < ctx->fc->nb_streams; ++i) { |
413 AVStream *st = ctx->fc->streams[i]; | 412 AVStream *st = ctx->fc->streams[i]; |
414 GXFStreamContext *sc = &ctx->streams[i]; | 413 GXFStreamContext *sc = st->priv_data; |
415 int id = 0; | 414 int id = 0; |
416 | 415 |
417 switch (st->codec->codec_id) { | 416 switch (st->codec->codec_id) { |
418 case CODEC_ID_MPEG1VIDEO: id= 'L'; break; | 417 case CODEC_ID_MPEG1VIDEO: id= 'L'; break; |
419 case CODEC_ID_MPEG2VIDEO: id= 'M'; break; | 418 case CODEC_ID_MPEG2VIDEO: id= 'M'; break; |
504 int i; | 503 int i; |
505 | 504 |
506 pos = url_ftell(pb); | 505 pos = url_ftell(pb); |
507 ctx->umf_media_offset = pos - ctx->umf_start_offset; | 506 ctx->umf_media_offset = pos - ctx->umf_start_offset; |
508 for (i = 0; i < ctx->fc->nb_streams; ++i) { | 507 for (i = 0; i < ctx->fc->nb_streams; ++i) { |
509 GXFStreamContext *sc = &ctx->streams[i]; | 508 GXFStreamContext *sc = ctx->fc->streams[i]->priv_data; |
510 char buffer[88]; | 509 char buffer[88]; |
511 int64_t startpos, curpos; | 510 int64_t startpos, curpos; |
512 int path_size = strlen(ES_NAME_PATTERN); | 511 int path_size = strlen(ES_NAME_PATTERN); |
513 | 512 |
514 memset(buffer, 0, 88); | 513 memset(buffer, 0, 88); |
596 | 595 |
597 gxf->fc = s; | 596 gxf->fc = s; |
598 gxf->flags |= 0x00080000; /* material is simple clip */ | 597 gxf->flags |= 0x00080000; /* material is simple clip */ |
599 for (i = 0; i < s->nb_streams; ++i) { | 598 for (i = 0; i < s->nb_streams; ++i) { |
600 AVStream *st = s->streams[i]; | 599 AVStream *st = s->streams[i]; |
601 GXFStreamContext *sc = &gxf->streams[i]; | 600 GXFStreamContext *sc = av_mallocz(sizeof(*sc)); |
601 if (!sc) | |
602 return AVERROR(ENOMEM); | |
603 st->priv_data = sc; | |
602 | 604 |
603 sc->codec = st->codec; | 605 sc->codec = st->codec; |
604 sc->index = i; | 606 sc->index = i; |
605 sc->media_type = codec_get_tag(gxf_media_types, sc->codec->codec_id); | 607 sc->media_type = codec_get_tag(gxf_media_types, sc->codec->codec_id); |
606 if (st->codec->codec_type == CODEC_TYPE_AUDIO) { | 608 if (st->codec->codec_type == CODEC_TYPE_AUDIO) { |
689 GXFContext *gxf = s->priv_data; | 691 GXFContext *gxf = s->priv_data; |
690 int64_t end; | 692 int64_t end; |
691 int i; | 693 int i; |
692 | 694 |
693 for (i = 0; i < s->nb_streams; ++i) { | 695 for (i = 0; i < s->nb_streams; ++i) { |
694 if (s->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO) | 696 AVStream *st = s->streams[i]; |
695 av_fifo_free(&gxf->streams[i].audio_buffer); | 697 if (st->codec->codec_type == CODEC_TYPE_AUDIO) |
698 av_fifo_free(&((GXFStreamContext*)st->priv_data)->audio_buffer); | |
696 } | 699 } |
697 | 700 |
698 gxf_write_eos_packet(pb, gxf); | 701 gxf_write_eos_packet(pb, gxf); |
699 end = url_ftell(pb); | 702 end = url_ftell(pb); |
700 url_fseek(pb, 0, SEEK_SET); | 703 url_fseek(pb, 0, SEEK_SET); |
718 return (buf[i+1]>>3)&7; | 721 return (buf[i+1]>>3)&7; |
719 } | 722 } |
720 | 723 |
721 static int gxf_write_media_preamble(ByteIOContext *pb, GXFContext *ctx, AVPacket *pkt, int size) | 724 static int gxf_write_media_preamble(ByteIOContext *pb, GXFContext *ctx, AVPacket *pkt, int size) |
722 { | 725 { |
723 GXFStreamContext *sc = &ctx->streams[pkt->stream_index]; | 726 GXFStreamContext *sc = ctx->fc->streams[pkt->stream_index]->priv_data; |
724 int64_t dts = av_rescale_rnd(pkt->dts, ctx->sample_rate, sc->codec->time_base.den, AV_ROUND_UP); | 727 int64_t dts = av_rescale_rnd(pkt->dts, ctx->sample_rate, sc->codec->time_base.den, AV_ROUND_UP); |
725 | 728 |
726 put_byte(pb, sc->media_type); | 729 put_byte(pb, sc->media_type); |
727 put_byte(pb, sc->index); | 730 put_byte(pb, sc->index); |
728 put_be32(pb, dts); | 731 put_be32(pb, dts); |
753 return 16; | 756 return 16; |
754 } | 757 } |
755 | 758 |
756 static int gxf_write_media_packet(ByteIOContext *pb, GXFContext *ctx, AVPacket *pkt) | 759 static int gxf_write_media_packet(ByteIOContext *pb, GXFContext *ctx, AVPacket *pkt) |
757 { | 760 { |
758 GXFStreamContext *sc = &ctx->streams[pkt->stream_index]; | 761 GXFStreamContext *sc = ctx->fc->streams[pkt->stream_index]->priv_data; |
759 int64_t pos = url_ftell(pb); | 762 int64_t pos = url_ftell(pb); |
760 int padding = 0; | 763 int padding = 0; |
761 | 764 |
762 gxf_write_packet_header(pb, PKT_MEDIA); | 765 gxf_write_packet_header(pb, PKT_MEDIA); |
763 if (sc->codec->codec_id == CODEC_ID_MPEG2VIDEO && pkt->size % 4) /* MPEG-2 frames must be padded */ | 766 if (sc->codec->codec_id == CODEC_ID_MPEG2VIDEO && pkt->size % 4) /* MPEG-2 frames must be padded */ |
803 AVPacket new_pkt; | 806 AVPacket new_pkt; |
804 int i; | 807 int i; |
805 | 808 |
806 for (i = 0; i < s->nb_streams; i++) { | 809 for (i = 0; i < s->nb_streams; i++) { |
807 AVStream *st = s->streams[i]; | 810 AVStream *st = s->streams[i]; |
808 GXFStreamContext *sc = &gxf->streams[i]; | 811 GXFStreamContext *sc = st->priv_data; |
809 if (st->codec->codec_type == CODEC_TYPE_AUDIO) { | 812 if (st->codec->codec_type == CODEC_TYPE_AUDIO) { |
810 if (pkt && pkt->stream_index == i) { | 813 if (pkt && pkt->stream_index == i) { |
811 av_fifo_generic_write(&sc->audio_buffer, pkt->data, pkt->size, NULL); | 814 av_fifo_generic_write(&sc->audio_buffer, pkt->data, pkt->size, NULL); |
812 pkt = NULL; | 815 pkt = NULL; |
813 } | 816 } |