Mercurial > libavformat.hg
comparison matroskaenc.c @ 4222:0267c4299992 libavformat
Do not reallocate AVPacket's data when muxing a packet
author | lucabe |
---|---|
date | Thu, 15 Jan 2009 14:03:07 +0000 |
parents | 7d2f3f1b68d8 |
children | 8f2cb573b5b0 |
comparison
equal
deleted
inserted
replaced
4221:55f448c99135 | 4222:0267c4299992 |
---|---|
783 | 783 |
784 static void mkv_write_block(AVFormatContext *s, unsigned int blockid, AVPacket *pkt, int flags) | 784 static void mkv_write_block(AVFormatContext *s, unsigned int blockid, AVPacket *pkt, int flags) |
785 { | 785 { |
786 MatroskaMuxContext *mkv = s->priv_data; | 786 MatroskaMuxContext *mkv = s->priv_data; |
787 ByteIOContext *pb = s->pb; | 787 ByteIOContext *pb = s->pb; |
788 AVCodecContext *codec = s->streams[pkt->stream_index]->codec; | |
788 | 789 |
789 av_log(s, AV_LOG_DEBUG, "Writing block at offset %" PRIu64 ", size %d, " | 790 av_log(s, AV_LOG_DEBUG, "Writing block at offset %" PRIu64 ", size %d, " |
790 "pts %" PRId64 ", dts %" PRId64 ", duration %d, flags %d\n", | 791 "pts %" PRId64 ", dts %" PRId64 ", duration %d, flags %d\n", |
791 url_ftell(pb), pkt->size, pkt->pts, pkt->dts, pkt->duration, flags); | 792 url_ftell(pb), pkt->size, pkt->pts, pkt->dts, pkt->duration, flags); |
792 put_ebml_id(pb, blockid); | 793 put_ebml_id(pb, blockid); |
793 put_ebml_num(pb, pkt->size+4, 0); | 794 put_ebml_num(pb, pkt->size+4, 0); |
794 put_byte(pb, 0x80 | (pkt->stream_index + 1)); // this assumes stream_index is less than 126 | 795 put_byte(pb, 0x80 | (pkt->stream_index + 1)); // this assumes stream_index is less than 126 |
795 put_be16(pb, pkt->pts - mkv->cluster_pts); | 796 put_be16(pb, pkt->pts - mkv->cluster_pts); |
796 put_byte(pb, flags); | 797 put_byte(pb, flags); |
798 if (codec->codec_id == CODEC_ID_H264 && | |
799 codec->extradata_size > 0 && AV_RB32(codec->extradata) == 0x00000001) { | |
800 /* from x264 or from bytestream h264 */ | |
801 /* nal reformating needed */ | |
802 ff_avc_parse_nal_units(pb, pkt->data, pkt->size); | |
803 } else { | |
797 put_buffer(pb, pkt->data, pkt->size); | 804 put_buffer(pb, pkt->data, pkt->size); |
805 } | |
798 } | 806 } |
799 | 807 |
800 static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) | 808 static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) |
801 { | 809 { |
802 MatroskaMuxContext *mkv = s->priv_data; | 810 MatroskaMuxContext *mkv = s->priv_data; |
818 mkv->cluster_pos = url_ftell(pb); | 826 mkv->cluster_pos = url_ftell(pb); |
819 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0); | 827 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0); |
820 put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, pkt->pts); | 828 put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, pkt->pts); |
821 mkv->cluster_pts = pkt->pts; | 829 mkv->cluster_pts = pkt->pts; |
822 av_md5_update(mkv->md5_ctx, pkt->data, FFMIN(200, pkt->size)); | 830 av_md5_update(mkv->md5_ctx, pkt->data, FFMIN(200, pkt->size)); |
823 } | |
824 | |
825 if (codec->codec_id == CODEC_ID_H264 && | |
826 codec->extradata_size > 0 && AV_RB32(codec->extradata) == 0x00000001) { | |
827 /* from x264 or from bytestream h264 */ | |
828 /* nal reformating needed */ | |
829 int ret = ff_avc_parse_nal_units(pkt->data, &pkt->data, &pkt->size); | |
830 if (ret < 0) | |
831 return ret; | |
832 assert(pkt->size); | |
833 } | 831 } |
834 | 832 |
835 if (codec->codec_type != CODEC_TYPE_SUBTITLE) { | 833 if (codec->codec_type != CODEC_TYPE_SUBTITLE) { |
836 mkv_write_block(s, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe << 7); | 834 mkv_write_block(s, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe << 7); |
837 } else if (codec->codec_id == CODEC_ID_SSA) { | 835 } else if (codec->codec_id == CODEC_ID_SSA) { |