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 }