From b5809a68bf94e5aa1172e5415be8d7fb91877de8 Mon Sep 17 00:00:00 2001 From: dongmao zhang Date: Thu, 9 Aug 2012 12:26:26 +0800 Subject: [PATCH] merge --- a.c | 254 +++++++++++++++++++++++++++++++++++ youtube-dl | Bin 42046 -> 42040 bytes youtube_dl/InfoExtractors.py | 4 +- 3 files changed, 256 insertions(+), 2 deletions(-) create mode 100644 a.c diff --git a/a.c b/a.c new file mode 100644 index 0000000000..50dc1cc913 --- /dev/null +++ b/a.c @@ -0,0 +1,254 @@ +#include +#include +#include +#include + +#define FLVF_HEADER 1 +#define FLVF_SCRIPT 2 + +struct flvhdr +{ + char fh_magic[3]; + char fh_version; + char fh_flags; + char fh_hlen[4]; + char fh_pads[4]; +}__attribute__((packed)); + +struct taghdr +{ + uint8_t th_type; + uint8_t th_dlen[3]; + uint8_t th_tstamp[3]; + uint8_t th_xstamp; + uint8_t th_streamid[3]; +}__attribute__((packed)); + +struct flvcombine +{ + FILE * fc_file; + uint32_t fc_flags; + uint32_t fc_timestamp; + uint32_t fc_filesize; + double fc_duration; + int fc_filesize_offset; + int fc_duration_offset; +}; + +/* duration, filesize */ + +uint32_t buftoint(const void *buf, size_t len) +{ + uint32_t bufint = 0; + const uint8_t *pval = (const uint8_t *)buf; + while (len-- > 0) + bufint = (bufint << 8) + *pval++; + return bufint; +} + +int dd_copy(FILE * dst_fp, FILE * src_fp, size_t dlen) +{ + size_t len; + char buf[64 * 1024]; + while (dlen > 0 && !feof(src_fp)) { + len = fread(buf, 1, dlen < sizeof(buf)? dlen: sizeof(buf), src_fp); + if (fwrite(buf, 1, len, dst_fp) != len) + break; + dlen -= len; + } + return dlen; +} + +void adjtimestamp(struct taghdr *header, uint32_t stampbase) +{ + uint32_t netval = 0; + uint32_t adjtime = stampbase; + adjtime += buftoint(&header->th_tstamp, sizeof(header->th_tstamp)); + adjtime += (header->th_xstamp << 24); + header->th_xstamp = (adjtime >> 24); + header->th_tstamp[0] = (adjtime >> 16); + header->th_tstamp[1] = (adjtime >> 8); + header->th_tstamp[2] = (adjtime >> 0); +} + +void update_metainfo(struct flvcombine *combine, FILE *fp, size_t dlen) +{ + int i; + size_t len; + char *pmem = NULL; + char buf[256 * 1024]; + double duration = 0.0; + uint8_t duration_bytes[8]; + printf("dlen: %d\n", dlen); + assert (dlen < (256 * 1024)); + + len = fread(buf, 1, dlen < sizeof(buf)? dlen: sizeof(buf), fp); + if (len == 0) + return; + pmem = (char *)memmem(buf, len, "duration", 8); + if (pmem == NULL || pmem + 17l - buf > len) + return; + memcpy(&duration_bytes, pmem + 9, 8); + for (i = 0; i < 4; i ++) { + uint8_t tmp = duration_bytes[i]; + duration_bytes[i] = duration_bytes[7 - i]; + duration_bytes[7 - i] = tmp; + } + memcpy(&duration, &duration_bytes, 8); + combine->fc_duration += duration; + if (combine->fc_flags & FLVF_SCRIPT) + return; + combine->fc_duration_offset = + combine->fc_filesize + (pmem + 9l - buf) + sizeof(struct taghdr); + pmem = (char *)memmem(buf, len, "filesize", 8); + if (pmem == NULL || pmem + 17l - buf > len) + return; + combine->fc_filesize_offset = + combine->fc_filesize + (pmem + 9l - buf) + sizeof(struct taghdr); +} + +int addflv(struct flvcombine *combine, const char *path) +{ + int error = 0; + FILE *fp, *fout; + char magic[4]; + long savepos; + size_t len, dlen, flags; + struct flvhdr header; + struct taghdr *last; + struct taghdr tagvideo; + struct taghdr tagaudio; + struct taghdr tagheader; + + fp = fopen(path, "rb"); + fout = combine->fc_file; + if (fp == NULL || fout == NULL) + return 0; + + last = NULL; + memset(magic, 0, sizeof(magic)); + memset(&tagvideo, 0, sizeof(tagvideo)); + memset(&tagaudio, 0, sizeof(tagaudio)); + + if ( !fread(&header, sizeof(header), 1, fp) ) + goto fail; + + memcpy(magic, header.fh_magic, 3); + if ( strcmp("FLV", magic) ) + goto fail; + + if ((combine->fc_flags & FLVF_HEADER) == 0) { + fwrite(&header, sizeof(header), 1, fout); + combine->fc_filesize += sizeof(header); + combine->fc_flags |= FLVF_HEADER; + } + + printf("magic: %s\n", magic); + printf("flags: 0x%02x\n", header.fh_flags); + printf("version: 0x%02x\n", header.fh_version); + printf("header len: %d\n", buftoint(header.fh_hlen, sizeof(header.fh_hlen))); + + while (feof(fp) == 0) { + if ( !fread(&tagheader, sizeof(tagheader), 1, fp) ) + goto fail; + + dlen = buftoint(tagheader.th_dlen, sizeof(tagheader.th_dlen)); + + switch (tagheader.th_type) + { + case 0x09: + adjtimestamp(&tagheader, combine->fc_timestamp); + tagvideo = tagheader; + last = &tagvideo; + break; + case 0x08: + adjtimestamp(&tagheader, combine->fc_timestamp); + tagaudio = tagheader; + last = &tagaudio; + break; + default: + flags = combine->fc_flags; + savepos = ftell(fp); + if (savepos == -1) + goto fail; + savepos = (flags & FLVF_SCRIPT)? (savepos + dlen + 4): savepos; + update_metainfo(combine, fp, dlen); + combine->fc_flags |= FLVF_SCRIPT; + if ( fseek(fp, savepos, SEEK_SET) ) + goto fail; + if (flags & FLVF_SCRIPT) + continue; + break; + } + fwrite(&tagheader, sizeof(tagheader), 1, fout); + combine->fc_filesize += sizeof(tagheader); + combine->fc_filesize += (dlen + 4); + if ( dd_copy(fout, fp, dlen + 4)) { + error = -__LINE__; + break; + } + } + +fail: + fclose(fp); + if (last == &tagvideo || last == &tagaudio) { + combine->fc_timestamp = buftoint(last->th_tstamp, sizeof(last->th_tstamp)); + combine->fc_timestamp |= (last->th_xstamp << 24); + printf("time stamp: %d\n", combine->fc_timestamp); + } + return 0; +} + +void fixedflv(struct flvcombine *context) +{ + int i; + double dblval = 0.0; + uint8_t dblbytes[8]; + FILE *fout = context->fc_file; + + if (context->fc_filesize_offset > 0) { + if ( fseek(fout, context->fc_filesize_offset, SEEK_SET) ) + return; + dblval = context->fc_filesize; + memcpy(dblbytes, &dblval, 8); + + for (i = 0; i < 4; i ++) { + uint8_t tmp = dblbytes[i]; + dblbytes[i] = dblbytes[7 - i]; + dblbytes[7 - i] = tmp; + } + fwrite(dblbytes, 8, 1, fout); + } + + if (context->fc_duration_offset > 0) { + if ( fseek(fout, context->fc_duration_offset, SEEK_SET) ) + return; + dblval = context->fc_duration; + memcpy(dblbytes, &dblval, 8); + + for (i = 0; i < 4; i ++) { + uint8_t tmp = dblbytes[i]; + dblbytes[i] = dblbytes[7 - i]; + dblbytes[7 - i] = tmp; + } + fwrite(dblbytes, 8, 1, fout); + } +} + +int main(int argc, char *argv[]) +{ + int i; + struct flvcombine context; + memset(&context, 0, sizeof(context)); + context.fc_file = fopen("out.flv", "wb"); + if (context.fc_file == NULL) + return -1; + context.fc_duration = 0; + for (i = 1; i < argc; i++) + addflv(&context, argv[i]); + fixedflv(&context); + fclose(context.fc_file); + + printf("seconds: %d\n", context.fc_timestamp); + return 0; +} diff --git a/youtube-dl b/youtube-dl index 09e205cc1f9333412cfafad15804b7d9c864abea..237181209161874fc06640ea4645299e8f3607c1 100755 GIT binary patch delta 13671 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 c1N4XhlOc%{lfI)s0c(^0qca8`q5uE@0D