Lines Matching defs:asf
34 #include "asf.h"
278 /* write an asf chunk (only used in streaming case) */
282 ASFContext *asf = s->priv_data;
289 avio_wl32(pb, asf->seqno); // sequence number
292 asf->seqno++;
305 static int32_t get_send_time(ASFContext *asf, int64_t pres_time, uint64_t *offset)
308 *offset = asf->data_offset + DATA_HEADER_SIZE;
309 for (int i = 0; i < asf->next_start_sec; i++) {
310 if (pres_time <= asf->index_ptr[i].send_time)
312 send_time = asf->index_ptr[i].send_time;
313 *offset = asf->index_ptr[i].offset;
321 ASFContext *asf = s->priv_data;
336 int32_t send_time = get_send_time(asf, pres_time, &offset);
361 ASFContext *asf = s->priv_data;
380 duration = asf->duration + PREROLL_TIME * 10000;
384 if (ff_parse_creation_time_metadata(s, &asf->creation_time, 0) != 0)
409 for (i = 0; i < asf->nb_languages; i++) {
410 if (!strcmp(asf->languages[i], iso6391lang)) {
411 asf->streams[n].stream_language_index = i;
415 if (i >= asf->nb_languages) {
416 asf->languages[asf->nb_languages] = iso6391lang;
417 asf->streams[n].stream_language_index = asf->nb_languages;
418 asf->nb_languages++;
421 audio_language_counts[asf->streams[n].stream_language_index]++;
424 asf->streams[n].stream_language_index = 128;
428 if (asf->is_streamed) {
443 avio_wl64(pb, unix_to_file_time(asf->creation_time));
444 avio_wl64(pb, asf->nb_packets); /* number of packets */
446 avio_wl64(pb, asf->duration); /* duration (in 100ns units) */
448 avio_wl32(pb, (asf->is_streamed || !(pb->seekable & AVIO_SEEKABLE_NORMAL)) ? 3 : 2); /* ??? */
459 if (asf->nb_languages) {
464 avio_wl16(pb, asf->nb_languages);
465 for (int i = 0; i < asf->nb_languages; i++) {
467 avio_put_str16le(pb, asf->languages[i]);
471 for (int i = 0; i < asf->nb_languages; i++)
479 for (int i = 0; i < asf->nb_languages; i++) {
483 if (asf->streams[n].stream_language_index == i && s->streams[n]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
492 if (asf->streams[n].stream_language_index > 127)
504 avio_wl32(pb, (!asf->is_streamed && (pb->seekable & AVIO_SEEKABLE_NORMAL)) << 1); /* flags - seekable */
506 avio_wl16(pb, asf->streams[n].stream_language_index); /* language id index */
583 if (!asf->is_streamed && s->nb_chapters) {
590 // ASFStream *stream = &asf->streams[n];
592 asf->streams[n].num = n + 1;
593 asf->streams[n].seq = 1;
717 if (asf->is_streamed) {
733 asf->data_offset = cur_pos;
737 avio_wl64(pb, asf->nb_packets); /* nb packets */
748 ASFContext *asf = s->priv_data;
751 s->packet_size = asf->packet_size;
753 asf->nb_packets = 0;
760 asf->index_ptr = av_malloc(sizeof(ASFIndex) * ASF_INDEX_BLOCK);
761 if (!asf->index_ptr)
763 asf->nb_index_memory_alloc = ASF_INDEX_BLOCK;
764 asf->maximum_packet = 0;
767 * data_size - asf->data_offset at the moment this function is done.
768 * It is needed to use asf as a streamable format. */
772 asf->packet_nb_payloads = 0;
773 asf->packet_timestamp_start = -1;
774 asf->packet_timestamp_end = -1;
775 ffio_init_context(&asf->pb, asf->packet_buf, s->packet_size, 1,
786 ASFContext *asf = s->priv_data;
788 asf->is_streamed = 1;
797 ASFContext *asf = s->priv_data;
805 if (asf->multi_payloads_present)
812 if (asf->multi_payloads_present)
832 if (asf->multi_payloads_present)
842 ASFContext *asf = s->priv_data;
845 av_assert0(asf->packet_timestamp_end >= asf->packet_timestamp_start);
847 if (asf->is_streamed)
851 asf->packet_timestamp_start,
852 asf->packet_timestamp_end - asf->packet_timestamp_start,
853 asf->packet_nb_payloads,
854 asf->packet_size_left);
856 packet_filled_size = asf->packet_size - asf->packet_size_left;
857 av_assert0(packet_hdr_size <= asf->packet_size_left);
858 memset(asf->packet_buf + packet_filled_size, 0, asf->packet_size_left);
860 avio_write(s->pb, asf->packet_buf, s->packet_size - packet_hdr_size);
864 asf->nb_packets++;
865 asf->packet_nb_payloads = 0;
866 asf->packet_timestamp_start = -1;
867 asf->packet_timestamp_end = -1;
868 ffio_init_context(&asf->pb, asf->packet_buf, s->packet_size, 1,
876 ASFContext *asf = s->priv_data;
877 AVIOContext *const pb = &asf->pb.pub;
898 if (asf->multi_payloads_present) {
907 ASFContext *asf = s->priv_data;
913 if (asf->packet_timestamp_start == -1) {
914 const int multi_payload_constant = (asf->packet_size - MULTI_PAYLOAD_HEADERS);
915 asf->multi_payloads_present = (payload_len < multi_payload_constant);
917 asf->packet_size_left = asf->packet_size;
918 if (asf->multi_payloads_present) {
921 frag_len1 = asf->packet_size - SINGLE_PAYLOAD_HEADERS;
923 asf->packet_timestamp_start = timestamp;
926 frag_len1 = asf->packet_size_left -
935 if (asf->packet_timestamp_start > INT64_MAX - UINT16_MAX ||
936 timestamp > asf->packet_timestamp_start + UINT16_MAX) {
949 avio_write(&asf->pb.pub, buf, payload_len);
951 if (asf->multi_payloads_present)
952 asf->packet_size_left -= (payload_len + PAYLOAD_HEADER_SIZE_MULTIPLE_PAYLOADS);
954 asf->packet_size_left -= (payload_len + PAYLOAD_HEADER_SIZE_SINGLE_PAYLOAD);
955 asf->packet_timestamp_end = timestamp;
957 asf->packet_nb_payloads++;
964 if (!asf->multi_payloads_present)
966 else if (asf->packet_size_left <= (PAYLOAD_HEADER_SIZE_MULTIPLE_PAYLOADS + PACKET_HEADER_MIN_SIZE + 1))
968 else if (asf->packet_nb_payloads == ASF_PAYLOADS_PER_PACKET)
978 ASFContext *asf = s->priv_data;
980 if (start_sec > asf->next_start_sec) {
981 if (!asf->next_start_sec) {
982 asf->next_packet_number = packet_number;
983 asf->next_packet_count = packet_count;
984 asf->next_packet_offset = packet_offset;
987 if (start_sec > asf->nb_index_memory_alloc) {
989 asf->nb_index_memory_alloc = (start_sec + ASF_INDEX_BLOCK) & ~(ASF_INDEX_BLOCK - 1);
990 if ((err = av_reallocp_array(&asf->index_ptr,
991 asf->nb_index_memory_alloc,
992 sizeof(*asf->index_ptr))) < 0) {
993 asf->nb_index_memory_alloc = 0;
997 for (int i = asf->next_start_sec; i < start_sec; i++) {
998 asf->index_ptr[i].packet_number = asf->next_packet_number;
999 asf->index_ptr[i].packet_count = asf->next_packet_count;
1000 asf->index_ptr[i].send_time = asf->next_start_sec * INT64_C(10000000);
1001 asf->index_ptr[i].offset = asf->next_packet_offset;
1005 asf->maximum_packet = FFMAX(asf->maximum_packet, packet_count);
1006 asf->next_packet_number = packet_number;
1007 asf->next_packet_count = packet_count;
1008 asf->next_packet_offset = packet_offset;
1009 asf->next_start_sec = start_sec;
1016 ASFContext *asf = s->priv_data;
1028 stream = &asf->streams[pkt->stream_index];
1041 asf->duration = FFMAX(asf->duration, pts + pkt->duration * 10000);
1043 packet_number = asf->nb_packets;
1051 if ((!asf->is_streamed) && (flags & AV_PKT_FLAG_KEY)) {
1052 uint16_t packet_count = asf->nb_packets - packet_number;
1057 asf->end_sec = start_sec;
1083 ASFContext *asf = s->priv_data;
1088 if (asf->pb.pub.buf_ptr > asf->pb.pub.buffer)
1093 if (!asf->is_streamed && asf->next_start_sec) {
1094 if ((ret = update_index(s, asf->end_sec + 1, 0, 0, 0)) < 0)
1096 asf_write_index(s, asf->index_ptr, asf->maximum_packet, asf->next_start_sec);
1099 if (asf->is_streamed || !(s->pb->seekable & AVIO_SEEKABLE_NORMAL)) {
1105 asf_write_header1(s, file_size, data_size - asf->data_offset);
1113 ASFContext *const asf = s->priv_data;
1115 av_freep(&asf->index_ptr);
1132 .name = "asf",
1134 .mime_type = "video/x-ms-asf",
1135 .extensions = "asf,wmv,wma",
1153 .mime_type = "video/x-ms-asf",
1154 .extensions = "asf,wmv,wma",