| 122 | } |
| 123 | |
| 124 | static int seq_parse_frame_data(SeqDemuxContext *seq, ByteIOContext *pb) |
| 125 | { |
| 126 | unsigned int offset_table[4], buffer_num[4]; |
| 127 | TiertexSeqFrameBuffer *seq_buffer; |
| 128 | int i, e, err; |
| 129 | |
| 130 | seq->current_frame_offs += SEQ_FRAME_SIZE; |
| 131 | url_fseek(pb, seq->current_frame_offs, SEEK_SET); |
| 132 | |
| 133 | /* sound data */ |
| 134 | seq->current_audio_data_offs = get_le16(pb); |
| 135 | if (seq->current_audio_data_offs) { |
| 136 | seq->current_audio_data_size = SEQ_AUDIO_BUFFER_SIZE * 2; |
| 137 | } else { |
| 138 | seq->current_audio_data_size = 0; |
| 139 | } |
| 140 | |
| 141 | /* palette data */ |
| 142 | seq->current_pal_data_offs = get_le16(pb); |
| 143 | if (seq->current_pal_data_offs) { |
| 144 | seq->current_pal_data_size = 768; |
| 145 | } else { |
| 146 | seq->current_pal_data_size = 0; |
| 147 | } |
| 148 | |
| 149 | /* video data */ |
| 150 | for (i = 0; i < 4; i++) |
| 151 | buffer_num[i] = get_byte(pb); |
| 152 | |
| 153 | for (i = 0; i < 4; i++) |
| 154 | offset_table[i] = get_le16(pb); |
| 155 | |
| 156 | for (i = 0; i < 3; i++) { |
| 157 | if (offset_table[i]) { |
| 158 | for (e = i + 1; e < 3 && offset_table[e] == 0; e++); |
| 159 | err = seq_fill_buffer(seq, pb, buffer_num[1 + i], |
| 160 | offset_table[i], |
| 161 | offset_table[e] - offset_table[i]); |
| 162 | if (err) |
| 163 | return err; |
| 164 | } |
| 165 | } |
| 166 | |
| 167 | if (buffer_num[0] != 255) { |
| 168 | if (buffer_num[0] >= SEQ_NUM_FRAME_BUFFERS) |
| 169 | return AVERROR_INVALIDDATA; |
| 170 | |
| 171 | seq_buffer = &seq->frame_buffers[buffer_num[0]]; |
| 172 | seq->current_video_data_size = seq_buffer->fill_size; |
| 173 | seq->current_video_data_ptr = seq_buffer->data; |
| 174 | seq_buffer->fill_size = 0; |
| 175 | } else { |
| 176 | seq->current_video_data_size = 0; |
| 177 | seq->current_video_data_ptr = 0; |
| 178 | } |
| 179 | |
| 180 | return 0; |
| 181 | } |
no test coverage detected