comparison matroskaenc.c @ 2460:c13388c21c2d libavformat

Move writing a block to its own function
author conrad
date Wed, 05 Sep 2007 00:23:47 +0000
parents 784c7327ef24
children 3a1ecd4ad76d
comparison
equal deleted inserted replaced
2459:784c7327ef24 2460:c13388c21c2d
549 return -1; 549 return -1;
550 550
551 return 0; 551 return 0;
552 } 552 }
553 553
554 static void mkv_write_block(AVFormatContext *s, unsigned int blockid, AVPacket *pkt, int flags)
555 {
556 MatroskaMuxContext *mkv = s->priv_data;
557 ByteIOContext *pb = &s->pb;
558
559 put_ebml_id(pb, blockid);
560 put_ebml_size(pb, pkt->size + 4, 0);
561 put_byte(pb, 0x80 | (pkt->stream_index + 1)); // this assumes stream_index is less than 126
562 put_be16(pb, pkt->pts - mkv->cluster_pts);
563 put_byte(pb, flags);
564 put_buffer(pb, pkt->data, pkt->size);
565 }
566
554 static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) 567 static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt)
555 { 568 {
556 MatroskaMuxContext *mkv = s->priv_data; 569 MatroskaMuxContext *mkv = s->priv_data;
557 ByteIOContext *pb = &s->pb; 570 ByteIOContext *pb = &s->pb;
558 int keyframe = !!(pkt->flags & PKT_FLAG_KEY); 571 int keyframe = !!(pkt->flags & PKT_FLAG_KEY);
568 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER); 581 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER);
569 put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, pkt->pts); 582 put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, pkt->pts);
570 mkv->cluster_pts = pkt->pts; 583 mkv->cluster_pts = pkt->pts;
571 } 584 }
572 585
573 put_ebml_id(pb, MATROSKA_ID_SIMPLEBLOCK); 586 mkv_write_block(s, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe << 7);
574 put_ebml_size(pb, pkt->size + 4, 0);
575 put_byte(pb, 0x80 | (pkt->stream_index + 1)); // this assumes stream_index is less than 126
576 put_be16(pb, pkt->pts - mkv->cluster_pts);
577 put_byte(pb, keyframe << 7);
578 put_buffer(pb, pkt->data, pkt->size);
579 587
580 if (s->streams[pkt->stream_index]->codec->codec_type == CODEC_TYPE_VIDEO && keyframe) { 588 if (s->streams[pkt->stream_index]->codec->codec_type == CODEC_TYPE_VIDEO && keyframe) {
581 if (mkv_add_cuepoint(mkv->cues, pkt, mkv->cluster_pos) < 0) 589 if (mkv_add_cuepoint(mkv->cues, pkt, mkv->cluster_pos) < 0)
582 return -1; 590 return -1;
583 } 591 }