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) {