+ /* check Speex packet duration */
+ if (enc->codec_id == AV_CODEC_ID_SPEEX && ts - sc->last_ts > 160)
+ av_log(s, AV_LOG_WARNING, "Warning: Speex stream has more than "
+ "8 frames per packet. Adobe Flash "
+ "Player cannot handle this!\n");
+
+ if (sc->last_ts < ts)
+ sc->last_ts = ts;
+
+ avio_wb24(pb, size + flags_size);
+ avio_wb24(pb, ts);
+ avio_w8(pb, (ts >> 24) & 0x7F); // timestamps are 32 bits _signed_
+ avio_wb24(pb, flv->reserved);
+
+ if (enc->codec_type == AVMEDIA_TYPE_DATA) {
+ int data_size;
+ int metadata_size_pos = avio_tell(pb);
+ avio_w8(pb, AMF_DATA_TYPE_STRING);
+ put_amf_string(pb, "onTextData");
+ avio_w8(pb, AMF_DATA_TYPE_MIXEDARRAY);
+ avio_wb32(pb, 2);
+ put_amf_string(pb, "type");
+ avio_w8(pb, AMF_DATA_TYPE_STRING);
+ put_amf_string(pb, "Text");
+ put_amf_string(pb, "text");
+ avio_w8(pb, AMF_DATA_TYPE_STRING);
+ put_amf_string(pb, pkt->data);
+ put_amf_string(pb, "");
+ avio_w8(pb, AMF_END_OF_OBJECT);
+ /* write total size of tag */
+ data_size = avio_tell(pb) - metadata_size_pos;
+ avio_seek(pb, metadata_size_pos - 10, SEEK_SET);
+ avio_wb24(pb, data_size);
+ avio_seek(pb, data_size + 10 - 3, SEEK_CUR);
+ avio_wb32(pb, data_size + 11);
+ } else {
+ avio_w8(pb,flags);
+ if (enc->codec_id == AV_CODEC_ID_VP6)
+ avio_w8(pb, 0);
+ if (enc->codec_id == AV_CODEC_ID_VP6F)
+ avio_w8(pb, enc->extradata_size ? enc->extradata[0] : 0);
+ else if (enc->codec_id == AV_CODEC_ID_AAC)
+ avio_w8(pb, 1); // AAC raw
+ else if (enc->codec_id == AV_CODEC_ID_H264) {
+ avio_w8(pb, 1); // AVC NALU
+ avio_wb24(pb, pkt->pts - pkt->dts);
+ }