Lines Matching defs:viv
26 * @brief Vividas VIV (.viv) file demuxer
280 static int track_header(VividasDemuxContext *viv, AVFormatContext *s, uint8_t *buf, int size)
353 viv->num_audio = avio_r8(pb);
356 if (viv->num_audio != 1)
357 av_log(s, AV_LOG_WARNING, "number of audio tracks %d is not 1\n", viv->num_audio);
359 for(i=0;i<viv->num_audio;i++) {
435 static int track_index(VividasDemuxContext *viv, AVFormatContext *s, uint8_t *buf, unsigned size)
453 viv->sb_blocks = av_calloc(n_sb_blocks_tmp, sizeof(*viv->sb_blocks));
454 if (!viv->sb_blocks) {
457 viv->n_sb_blocks = n_sb_blocks_tmp;
462 for (i = 0; i < viv->n_sb_blocks; i++) {
469 viv->sb_blocks[i].byte_offset = off;
470 viv->sb_blocks[i].packet_offset = poff;
472 viv->sb_blocks[i].size = size_tmp;
473 viv->sb_blocks[i].n_packets = n_packets_tmp;
475 off += viv->sb_blocks[i].size;
476 poff += viv->sb_blocks[i].n_packets;
478 if (maxnp < viv->sb_blocks[i].n_packets)
479 maxnp = viv->sb_blocks[i].n_packets;
485 viv->sb_entries = av_calloc(maxnp, sizeof(VIV_SB_entry));
486 if (!viv->sb_entries)
492 static void load_sb_block(AVFormatContext *s, VividasDemuxContext *viv, unsigned expected_size)
498 if (viv->sb_pb) {
499 av_free(viv->sb_pb);
500 viv->sb_pb = NULL;
503 if (viv->sb_buf)
504 av_free(viv->sb_buf);
506 viv->sb_buf = read_sb_block(s->pb, &size, &viv->sb_key, expected_size);
507 if (!viv->sb_buf) {
511 pb = avio_alloc_context(viv->sb_buf, size, 0, NULL, NULL, NULL, NULL);
515 viv->sb_pb = pb;
523 viv->n_sb_entries = viv->sb_blocks[viv->current_sb].n_packets;
525 for (i = 0; i < viv->n_sb_entries; i++) {
526 viv->sb_entries[i].size = ffio_read_varlen(pb);
527 viv->sb_entries[i].flag = avio_r8(pb);
533 viv->current_sb_entry = 0;
538 VividasDemuxContext *viv = s->priv_data;
568 viv->sb_key = key;
607 ret = track_header(viv, s, buf, v);
615 ret = track_index(viv, s, buf, v);
620 viv->sb_offset = avio_tell(pb);
621 if (viv->n_sb_blocks > 0) {
622 viv->current_sb = 0;
623 load_sb_block(s, viv, viv->sb_blocks[0].size);
625 viv->current_sb = -1;
634 VividasDemuxContext *viv = s->priv_data;
639 if (!viv->sb_pb)
641 if (avio_feof(viv->sb_pb))
644 if (viv->current_audio_subpacket < viv->n_audio_subpackets) {
646 int size = viv->audio_subpackets[viv->current_audio_subpacket+1].start - viv->audio_subpackets[viv->current_audio_subpacket].start;
648 pb = viv->sb_pb;
652 pkt->pos += viv->sb_offset + viv->sb_blocks[viv->current_sb].byte_offset;
657 pkt->pts = av_rescale_q(viv->audio_sample, av_make_q(1, astream->codecpar->sample_rate), astream->time_base);
658 viv->audio_sample += viv->audio_subpackets[viv->current_audio_subpacket].pcm_bytes / 2 /
661 viv->current_audio_subpacket++;
665 if (viv->current_sb_entry >= viv->n_sb_entries) {
666 if (viv->current_sb+1 >= viv->n_sb_blocks)
668 viv->current_sb++;
670 load_sb_block(s, viv, 0);
671 viv->current_sb_entry = 0;
674 pb = viv->sb_pb;
679 if (viv->current_sb_entry >= viv->n_sb_entries)
682 off += viv->sb_entries[viv->current_sb_entry].size;
684 if (viv->sb_entries[viv->current_sb_entry].flag == 0) {
688 if (!viv->num_audio)
697 pkt->pos += viv->sb_offset + viv->sb_blocks[viv->current_sb].byte_offset;
699 pkt->pts = viv->sb_blocks[viv->current_sb].packet_offset + viv->current_sb_entry;
713 viv->n_audio_subpackets = i + 1;
715 viv->audio_subpackets[i].start = start;
716 viv->audio_subpackets[i].pcm_bytes = pcm_bytes;
719 viv->audio_subpackets[viv->n_audio_subpackets].start = (int)(off - avio_tell(pb));
722 viv->current_audio_subpacket = 0;
732 pkt->pos += viv->sb_offset + viv->sb_blocks[viv->current_sb].byte_offset;
733 pkt->pts = viv->sb_blocks[viv->current_sb].packet_offset + viv->current_sb_entry;
738 viv->current_sb_entry++;
745 VividasDemuxContext *viv = s->priv_data;
747 av_freep(&viv->sb_pb);
748 av_freep(&viv->sb_buf);
749 av_freep(&viv->sb_blocks);
750 av_freep(&viv->sb_entries);
757 VividasDemuxContext *viv = s->priv_data;
765 for (int i = 0; i < viv->n_sb_blocks; i++) {
766 if (frame >= viv->sb_blocks[i].packet_offset && frame < viv->sb_blocks[i].packet_offset + viv->sb_blocks[i].n_packets) {
767 viv->current_sb = i;
769 avio_seek(s->pb, viv->sb_offset + viv->sb_blocks[i].byte_offset, SEEK_SET);
771 load_sb_block(s, viv, 0);
772 if (viv->num_audio) {
775 viv->current_audio_subpacket = 0;
776 viv->n_audio_subpackets = 0;
778 viv->audio_sample = av_rescale_q(viv->sb_blocks[i].packet_offset,
782 viv->audio_sample += par->sample_rate;
784 viv->current_sb_entry = 0;