|
|
|
@@ -112,16 +112,23 @@ static int aa_read_header(AVFormatContext *s) |
|
|
|
avio_read(pb, val, nval); // value string |
|
|
|
} |
|
|
|
if (!strcmp(key, "codec")) { |
|
|
|
av_log(s, AV_LOG_DEBUG, "Codec is <%s>\n", val); |
|
|
|
strncpy(codec_name, val, sizeof(codec_name) - 1); |
|
|
|
} |
|
|
|
if (!strcmp(key, "HeaderSeed")) { |
|
|
|
av_log(s, AV_LOG_DEBUG, "HeaderSeed is <%s>\n", val); |
|
|
|
header_seed = atoi(val); |
|
|
|
} |
|
|
|
if (!strcmp(key, "HeaderKey")) { // this looks like "1234567890 1234567890 1234567890 1234567890" |
|
|
|
sscanf(val, "%d%d%d%d", &header_key_part[0], &header_key_part[1], &header_key_part[2], &header_key_part[3]); |
|
|
|
av_log(s, AV_LOG_DEBUG, "HeaderKey is <%s>\n", val); |
|
|
|
sscanf(val, "%u%u%u%u", &header_key_part[0], &header_key_part[1], &header_key_part[2], &header_key_part[3]); |
|
|
|
for (idx = 0; idx < 4; idx++) { |
|
|
|
AV_WB32(&header_key[idx * 4], header_key_part[idx]); // convert each part to BE! |
|
|
|
} |
|
|
|
av_log(s, AV_LOG_DEBUG, "Processed HeaderKey is "); |
|
|
|
for (i = 0; i < 16; i++) |
|
|
|
av_log(s, AV_LOG_DEBUG, "%02x", header_key[i]); |
|
|
|
av_log(s, AV_LOG_DEBUG, "\n"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@@ -143,7 +150,7 @@ static int aa_read_header(AVFormatContext *s) |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
av_tea_init(c->tea_ctx, c->aa_fixed_key, 16); |
|
|
|
output[0] = output[1] = 0; // purely for padding purposes |
|
|
|
memcpy(output + 2, &header_key, 16); |
|
|
|
memcpy(output + 2, header_key, 16); |
|
|
|
idx = 0; |
|
|
|
for (i = 0; i < 3; i++) { // TEA CBC with weird mixed endianness |
|
|
|
AV_WB32(src, header_seed); |
|
|
|
@@ -155,6 +162,10 @@ static int aa_read_header(AVFormatContext *s) |
|
|
|
} |
|
|
|
} |
|
|
|
memcpy(c->file_key, output + 2, 16); // skip first 2 bytes of output |
|
|
|
av_log(s, AV_LOG_DEBUG, "File key is "); |
|
|
|
for (i = 0; i < 16; i++) |
|
|
|
av_log(s, AV_LOG_DEBUG, "%02x", c->file_key[i]); |
|
|
|
av_log(s, AV_LOG_DEBUG, "\n"); |
|
|
|
|
|
|
|
/* decoder setup */ |
|
|
|
st = avformat_new_stream(s, NULL); |
|
|
|
|