annotate vocenc.c @ 1700:77bd711c0aed libavformat

adding a few checks to the audio packet descrambling, this should hopefully catch all related out of array accesses note, the original code might have been exploitable
author michael
date Mon, 22 Jan 2007 03:19:00 +0000
parents bbb1abaa43cb
children 06083249909c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
1 /*
1535
a3fbb2b1fccf split voc.c into vocdec.c and vocenc.c
aurel
parents: 1358
diff changeset
2 * Creative Voice File muxer.
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
3 * Copyright (c) 2006 Aurelien Jacobs <aurel@gnuage.org>
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
4 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1172
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1172
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1172
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1172
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1172
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
15 * Lesser General Public License for more details.
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
16 *
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1172
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
20 */
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
21
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
22 #include "voc.h"
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
23
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
24
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
25 typedef struct voc_enc_context {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
26 int param_written;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
27 } voc_enc_context_t;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
28
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
29 static int voc_write_header(AVFormatContext *s)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
30 {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
31 ByteIOContext *pb = &s->pb;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
32 const int header_size = 26;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
33 const int version = 0x0114;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
34
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
35 if (s->nb_streams != 1
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
36 || s->streams[0]->codec->codec_type != CODEC_TYPE_AUDIO)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
37 return AVERROR_NOTSUPP;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
38
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
39 put_buffer(pb, voc_magic, sizeof(voc_magic) - 1);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
40 put_le16(pb, header_size);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
41 put_le16(pb, version);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
42 put_le16(pb, ~version + 0x1234);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
43
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
44 return 0;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
45 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
46
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
47 static int voc_write_packet(AVFormatContext *s, AVPacket *pkt)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
48 {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
49 voc_enc_context_t *voc = s->priv_data;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
50 AVCodecContext *enc = s->streams[0]->codec;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
51 ByteIOContext *pb = &s->pb;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
52
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
53 if (!voc->param_written) {
1694
bbb1abaa43cb remove now useless codec_tag setting code in voc muxer
aurel
parents: 1679
diff changeset
54 if (enc->codec_tag > 0xFF) {
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
55 put_byte(pb, VOC_TYPE_NEW_VOICE_DATA);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
56 put_le24(pb, pkt->size + 12);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
57 put_le32(pb, enc->sample_rate);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
58 put_byte(pb, enc->bits_per_sample);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
59 put_byte(pb, enc->channels);
1694
bbb1abaa43cb remove now useless codec_tag setting code in voc muxer
aurel
parents: 1679
diff changeset
60 put_le16(pb, enc->codec_tag);
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
61 put_le32(pb, 0);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
62 } else {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
63 if (s->streams[0]->codec->channels > 1) {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
64 put_byte(pb, VOC_TYPE_EXTENDED);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
65 put_le24(pb, 4);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
66 put_le16(pb, 65536-256000000/(enc->sample_rate*enc->channels));
1694
bbb1abaa43cb remove now useless codec_tag setting code in voc muxer
aurel
parents: 1679
diff changeset
67 put_byte(pb, enc->codec_tag);
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
68 put_byte(pb, enc->channels - 1);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
69 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
70 put_byte(pb, VOC_TYPE_VOICE_DATA);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
71 put_le24(pb, pkt->size + 2);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
72 put_byte(pb, 256 - 1000000 / enc->sample_rate);
1694
bbb1abaa43cb remove now useless codec_tag setting code in voc muxer
aurel
parents: 1679
diff changeset
73 put_byte(pb, enc->codec_tag);
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
74 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
75 voc->param_written = 1;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
76 } else {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
77 put_byte(pb, VOC_TYPE_VOICE_DATA_CONT);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
78 put_le24(pb, pkt->size);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
79 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
80
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
81 put_buffer(pb, pkt->data, pkt->size);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
82 return 0;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
83 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
84
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
85 static int voc_write_trailer(AVFormatContext *s)
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
86 {
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
87 put_byte(&s->pb, 0);
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
88 return 0;
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
89 }
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
90
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
91 AVOutputFormat voc_muxer = {
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
92 "voc",
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
93 "Creative Voice File format",
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
94 "audio/x-voc",
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
95 "voc",
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
96 sizeof(voc_enc_context_t),
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
97 CODEC_ID_PCM_U8,
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
98 CODEC_ID_NONE,
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
99 voc_write_header,
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
100 voc_write_packet,
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
101 voc_write_trailer,
1679
ba58d49d4685 get rid of the [4] limitation of codec tag lists
michael
parents: 1678
diff changeset
102 .codec_tag=(const AVCodecTag*[]){voc_codec_tags, 0},
937
a887adfe9dc5 add a Creative VOC (de)muxer
aurel
parents:
diff changeset
103 };