timecode = cluster_time + block_time;
for (n = 0; n < laces; n++) {
- if (st->codec->codec_id == CODEC_ID_RA_288 ||
- st->codec->codec_id == CODEC_ID_COOK ||
- st->codec->codec_id == CODEC_ID_ATRAC3) {
- MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *)matroska->tracks[track];
- int a = st->codec->block_align;
- int sps = audiotrack->sub_packet_size;
- int cfs = audiotrack->coded_framesize;
- int h = audiotrack->sub_packet_h;
- int y = audiotrack->sub_packet_cnt;
- int w = audiotrack->frame_size;
- int x;
-
- if (!audiotrack->pkt_cnt) {
- if (st->codec->codec_id == CODEC_ID_RA_288)
- for (x=0; x<h/2; x++)
- memcpy(audiotrack->buf+x*2*w+y*cfs,
- data+x*cfs, cfs);
- else
- for (x=0; x<w/sps; x++)
- memcpy(audiotrack->buf+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), data+x*sps, sps);
-
- if (++audiotrack->sub_packet_cnt >= h) {
- audiotrack->sub_packet_cnt = 0;
- audiotrack->pkt_cnt = h*w / a;
- }
- }
- while (audiotrack->pkt_cnt) {
- pkt = av_mallocz(sizeof(AVPacket));
- av_new_packet(pkt, a);
- memcpy(pkt->data, audiotrack->buf
- + a * (h*w / a - audiotrack->pkt_cnt--), a);
- pkt->pos = pos;
- pkt->stream_index = matroska->tracks[track]->stream_index;
- matroska_queue_packet(matroska, pkt);
- }
- } else {
- int offset = 0;
-
- if (st->codec->codec_id == CODEC_ID_TEXT
- && ((MatroskaSubtitleTrack *)(matroska->tracks[track]))->ass) {
- int i;
- for (i=0; i<8 && data[offset]; offset++)
- if (data[offset] == ',')
- i++;
+ if (st->codec->codec_id == CODEC_ID_RA_288 ||
+ st->codec->codec_id == CODEC_ID_COOK ||
+ st->codec->codec_id == CODEC_ID_ATRAC3) {
+ MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *)matroska->tracks[track];
+ int a = st->codec->block_align;
+ int sps = audiotrack->sub_packet_size;
+ int cfs = audiotrack->coded_framesize;
+ int h = audiotrack->sub_packet_h;
+ int y = audiotrack->sub_packet_cnt;
+ int w = audiotrack->frame_size;
+ int x;
+
+ if (!audiotrack->pkt_cnt) {
+ if (st->codec->codec_id == CODEC_ID_RA_288)
+ for (x=0; x<h/2; x++)
+ memcpy(audiotrack->buf+x*2*w+y*cfs,
+ data+x*cfs, cfs);
+ else
+ for (x=0; x<w/sps; x++)
+ memcpy(audiotrack->buf+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), data+x*sps, sps);
+
+ if (++audiotrack->sub_packet_cnt >= h) {
+ audiotrack->sub_packet_cnt = 0;
+ audiotrack->pkt_cnt = h*w / a;
}
-
+ }
+ while (audiotrack->pkt_cnt) {
pkt = av_mallocz(sizeof(AVPacket));
- /* XXX: prevent data copy... */
- if (av_new_packet(pkt, lace_size[n]-offset) < 0) {
- res = AVERROR(ENOMEM);
- n = laces-1;
- break;
- }
- memcpy (pkt->data, data+offset, lace_size[n]-offset);
-
- if (n == 0)
- pkt->flags = is_keyframe;
- pkt->stream_index = matroska->tracks[track]->stream_index;
-
- pkt->pts = timecode;
+ av_new_packet(pkt, a);
+ memcpy(pkt->data, audiotrack->buf
+ + a * (h*w / a - audiotrack->pkt_cnt--), a);
pkt->pos = pos;
- pkt->duration = duration;
-
+ pkt->stream_index = matroska->tracks[track]->stream_index;
matroska_queue_packet(matroska, pkt);
}
+ } else {
+ int offset = 0;
+
+ if (st->codec->codec_id == CODEC_ID_TEXT
+ && ((MatroskaSubtitleTrack *)(matroska->tracks[track]))->ass) {
+ int i;
+ for (i=0; i<8 && data[offset]; offset++)
+ if (data[offset] == ',')
+ i++;
+ }
+
+ pkt = av_mallocz(sizeof(AVPacket));
+ /* XXX: prevent data copy... */
+ if (av_new_packet(pkt, lace_size[n]-offset) < 0) {
+ res = AVERROR(ENOMEM);
+ n = laces-1;
+ break;
+ }
+ memcpy (pkt->data, data+offset, lace_size[n]-offset);
+
+ if (n == 0)
+ pkt->flags = is_keyframe;
+ pkt->stream_index = matroska->tracks[track]->stream_index;
+
+ pkt->pts = timecode;
+ pkt->pos = pos;
+ pkt->duration = duration;
+
+ matroska_queue_packet(matroska, pkt);
+ }
- if (timecode != AV_NOPTS_VALUE)
- timecode = duration ? timecode + duration : AV_NOPTS_VALUE;
+ if (timecode != AV_NOPTS_VALUE)
+ timecode = duration ? timecode + duration : AV_NOPTS_VALUE;
data += lace_size[n];
}
}