Adult Script Pro Community Forums

The forum is here for legacy reasons. No new posts will be created. User registration is disabled! If you have any questions, please email us or check https://www.adultscriptpro.com for more details!

You are not logged in.

#1 2012-04-25 14:25:03

symtab
Administrator
Registered: 2010-08-23
Posts: 7,501
Website

[HOWTO] Install PHP Upload Progress Extension for Adult Script Pro

Hi,

Starting with Adult Script Pro there will be two methods of displaying a progress bar on uploads, first one using a PHP Extension called Upload Progress (http://pecl.php.net/package/uploadprogress) and second method using a pure Javascript progress bar. This howto explains how to install the Upload Progress PHP Extension, you will need ssh root access and minimal experience with linux/unix console. Make sure you have php-devel installed (usually yum install php-devel for plesk based servers and no update required for cpanel based servers) and then run the following code:

wget -c http://pecl.php.net/get/uploadprogress-1.0.3.1.tgz
tar -zxf uploadprogress-1.0.3.1.tgz
cd uploadprogress-1.0.3.1
phpize
./configure && make && make install

Now we need to add the uploadprogress extension to php.ini. Usually you need to edit /etc/php.ini or /usr/local/lib/php.ini (for cpanel based servers) and add:

extension=uploadprogress.so

Now restart apache:

service httpd restart

or for cpanel based servers:

/usr/local/apache/bin/apachectl restart

Done :-)


Adult Scripts: Adult Script Pro - Adult Search Script
Adult Advertising/Traffic: Plug Rush - EXOClick - PopAds

Offline

#2 2012-04-26 14:08:44

MS_DA
Member
Registered: 2011-04-26
Posts: 401
Website

Re: [HOWTO] Install PHP Upload Progress Extension for Adult Script Pro

Many thanks Adrian big_smile

Very easy to add it with this "How To" tongue

I wished QT FastStart could be done as easy too - didn´t get it managed yet to install it lol .

Ben

Offline

#3 2012-04-26 17:41:04

symtab
Administrator
Registered: 2010-08-23
Posts: 7,501
Website

Re: [HOWTO] Install PHP Upload Progress Extension for Adult Script Pro

qt-faststart is installed when you install ffmpeg, but you can it install it separately also, but its not recommended, because its missing some features:

wget -c http://multimedia.cx/qt-faststart.c
gcc qt-faststart.c -o qt-faststart
cp qt-faststart /usr/local/bin/qt-faststart

Adult Scripts: Adult Script Pro - Adult Search Script
Adult Advertising/Traffic: Plug Rush - EXOClick - PopAds

Offline

#4 2012-04-26 18:21:35

MS_DA
Member
Registered: 2011-04-26
Posts: 401
Website

Re: [HOWTO] Install PHP Upload Progress Extension for Adult Script Pro

Many Thanks Adrian big_smile

Well the ffmpeg and features have been installed by the server staff while setting the server up - even without QT Faststart and Yamdi. All files are inside a ffmpeg folder but there the QT Faststart install instructions of the other topic dun run.

Offline

#5 2012-05-01 08:11:07

MS_DA
Member
Registered: 2011-04-26
Posts: 401
Website

Re: [HOWTO] Install PHP Upload Progress Extension for Adult Script Pro

symtab wrote:

qt-faststart is installed when you install ffmpeg, but you can it install it separately also, but its not recommended, because its missing some features:

wget -c http://multimedia.cx/qt-faststart.c
gcc qt-faststart.c -o qt-faststart
cp qt-faststart /usr/local/bin/qt-faststart

Got a huge load of error messages on this and the install didn´t work sad

Offline

#6 2012-05-01 08:57:25

symtab
Administrator
Registered: 2010-08-23
Posts: 7,501
Website

Re: [HOWTO] Install PHP Upload Progress Extension for Adult Script Pro

What errors did you get? It should just compile. Please post the errors here.


Adult Scripts: Adult Script Pro - Adult Search Script
Adult Advertising/Traffic: Plug Rush - EXOClick - PopAds

Offline

#7 2012-05-01 11:45:59

MS_DA
Member
Registered: 2011-04-26
Posts: 401
Website

Re: [HOWTO] Install PHP Upload Progress Extension for Adult Script Pro

Got all this

qt-faststart.c:1: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before â:â token
In file included from /usr/include/_G_config.h:44,
                 from /usr/include/libio.h:32,
                 from /usr/include/stdio.h:72,
                 from qt-faststart.c:37:
/usr/include/gconv.h:72: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/gconv.h:88: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/gconv.h:97: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/gconv.h:174: error: expected specifier-qualifier-list before âsize_tâ
In file included from /usr/include/stdio.h:72,
                 from qt-faststart.c:37:
/usr/include/libio.h:329: error: expected specifier-qualifier-list before âsize_tâ
/usr/include/libio.h:361: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/libio.h:370: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/libio.h:486: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before â_IO_sgetnâ
In file included from qt-faststart.c:37:
/usr/include/stdio.h:308: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/stdio.h:315: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/stdio.h:357: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/stdio.h:359: error: format string argument not a string type
/usr/include/stdio.h:361: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/stdio.h:610: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before âfreadâ
/usr/include/stdio.h:616: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before âfwriteâ
/usr/include/stdio.h:638: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before âfread_unlockedâ
/usr/include/stdio.h:640: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before âfwrite_unlockedâ
In file included from qt-faststart.c:38:
/usr/include/stdlib.h:140: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before â__ctype_get_mb_cur_maxâ
In file included from qt-faststart.c:38:
/usr/include/stdlib.h:455: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/stdlib.h:485: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/stdlib.h:487: error: nonnull argument with out-of-range operand number (argument 1, operand 4)
/usr/include/stdlib.h:589: error: expected â)â before â__sizeâ
/usr/include/stdlib.h:591: error: expected â)â before â__nmembâ
/usr/include/stdlib.h:600: error: expected declaration specifiers or â...â before âsize_tâ
In file included from /usr/include/stdlib.h:612,
                 from qt-faststart.c:38:
/usr/include/alloca.h:33: error: expected â)â before â__sizeâ
In file included from qt-faststart.c:38:
/usr/include/stdlib.h:617: error: expected â)â before â__sizeâ
/usr/include/stdlib.h:622: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/stdlib.h:622: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/stdlib.h:775: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/stdlib.h:775: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/stdlib.h:776: error: nonnull argument with out-of-range operand number (argument 1, operand 5)
/usr/include/stdlib.h:780: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/stdlib.h:780: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/stdlib.h:781: error: nonnull argument with out-of-range operand number (argument 1, operand 4)
/usr/include/stdlib.h:853: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/stdlib.h:856: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/stdlib.h:860: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/stdlib.h:864: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/stdlib.h:873: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/stdlib.h:877: error: expected declaration specifiers or â...â before âsize_tâ
/usr/include/stdlib.h:884: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before âmbstowcsâ
/usr/include/stdlib.h:887: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before âwcstombsâ
qt-faststart.c: In function âmainâ:
qt-faststart.c:152: warning: incompatible implicit declaration of built-in function âmallocâ
qt-faststart.c:241: warning: incompatible implicit declaration of built-in function âfwriteâ

Offline

#8 2012-05-01 15:52:47

symtab
Administrator
Registered: 2010-08-23
Posts: 7,501
Website

Re: [HOWTO] Install PHP Upload Progress Extension for Adult Script Pro

There is something wrong with the file you've downloaded, try with this:

/*
 * qt-faststart.c, v0.1
 * by Mike Melanson (mike at multimedia.cx)
 * This file is placed in the public domain. Use the program however you
 * see fit.
 *
 * This utility rearranges a Quicktime file such that the moov atom
 * is in front of the data, thus facilitating network streaming.
 *
 * Compile this program using:
 *  cc qt-faststart.c -o qt-faststart
 * Invoke the program with:
 *  qt-faststart <infile.mov> <outfile.mov>
 *
 * Notes: Quicktime files can come in many configurations of top-level
 * atoms. This utility stipulates that the very last atom in the file needs
 * to be a moov atom. When given such a file, this utility will rearrange
 * the top-level atoms by shifting the moov atom from the back of the file
 * to the front, and patch the chunk offsets along the way. This utility
 * presently only operates on uncompressed moov atoms.
 */

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

#define BE_16(x) ((((uint8_t*)(x))[0] << 8) | ((uint8_t*)(x))[1])
#define BE_32(x) ((((uint8_t*)(x))[0] << 24) | \
                  (((uint8_t*)(x))[1] << 16) | \
                  (((uint8_t*)(x))[2] << 8) | \
                   ((uint8_t*)(x))[3])
#define BE_64(x) (((uint64_t)(((uint8_t*)(x))[0]) << 56) | \
                  ((uint64_t)(((uint8_t*)(x))[1]) << 48) | \
                  ((uint64_t)(((uint8_t*)(x))[2]) << 40) | \
                  ((uint64_t)(((uint8_t*)(x))[3]) << 32) | \
                  ((uint64_t)(((uint8_t*)(x))[4]) << 24) | \
                  ((uint64_t)(((uint8_t*)(x))[5]) << 16) | \
                  ((uint64_t)(((uint8_t*)(x))[6]) << 8) | \
                  ((uint64_t)((uint8_t*)(x))[7]))

#define BE_FOURCC( ch0, ch1, ch2, ch3 )             \
        ( (uint32_t)(unsigned char)(ch3) |          \
        ( (uint32_t)(unsigned char)(ch2) << 8 ) |   \
        ( (uint32_t)(unsigned char)(ch1) << 16 ) |  \
        ( (uint32_t)(unsigned char)(ch0) << 24 ) )

#define QT_ATOM BE_FOURCC
/* top level atoms */
#define FREE_ATOM QT_ATOM('f', 'r', 'e', 'e')
#define JUNK_ATOM QT_ATOM('j', 'u', 'n', 'k')
#define MDAT_ATOM QT_ATOM('m', 'd', 'a', 't')
#define MOOV_ATOM QT_ATOM('m', 'o', 'o', 'v')
#define PNOT_ATOM QT_ATOM('p', 'n', 'o', 't')
#define SKIP_ATOM QT_ATOM('s', 'k', 'i', 'p')
#define WIDE_ATOM QT_ATOM('w', 'i', 'd', 'e')
#define PICT_ATOM QT_ATOM('P', 'I', 'C', 'T')
#define FTYP_ATOM QT_ATOM('f', 't', 'y', 'p')

#define CMOV_ATOM QT_ATOM('c', 'm', 'o', 'v')
#define STCO_ATOM QT_ATOM('s', 't', 'c', 'o')
#define CO64_ATOM QT_ATOM('c', 'o', '6', '4')

#define ATOM_PREAMBLE_SIZE 8
#define COPY_BUFFER_SIZE 1024

int main(int argc, char *argv[])
{
    FILE *infile;
    FILE *outfile;
    unsigned char atom_bytes[ATOM_PREAMBLE_SIZE];
    uint32_t atom_type = 0;
    uint64_t atom_size;
    uint64_t last_offset;
    unsigned char *moov_atom;
    uint64_t moov_atom_size;
    uint64_t i, j;
    uint32_t offset_count;
    uint64_t current_offset;
    unsigned char copy_buffer[COPY_BUFFER_SIZE];
    int bytes_to_copy;

    if (argc != 3) {
        printf ("Usage: qt-faststart <infile.mov> <outfile.mov>\n");
        return 0;
    }

    infile = fopen(argv[1], "rb");
    if (!infile) {
        perror(argv[1]);
        return 1;
    }

    /* traverse through the atoms in the file to make sure that 'moov' is
     * at the end */
    while (!feof(infile)) {
        if (fread(atom_bytes, ATOM_PREAMBLE_SIZE, 1, infile) != 1) {
            break;
        }
        atom_size = BE_32(&atom_bytes[0]);
        atom_type = BE_32(&atom_bytes[4]);

        if ((atom_type != FREE_ATOM) &&
            (atom_type != JUNK_ATOM) &&
            (atom_type != MDAT_ATOM) &&
            (atom_type != MOOV_ATOM) &&
            (atom_type != PNOT_ATOM) &&
            (atom_type != SKIP_ATOM) &&
            (atom_type != WIDE_ATOM) &&
            (atom_type != PICT_ATOM) &&
            (atom_type != FTYP_ATOM)) {
            printf ("encountered non-QT top-level atom (is this a Quicktime file?)\n");
            break;
        }

        /* 64-bit special case */
        if (atom_size == 1) {
            if (fread(atom_bytes, ATOM_PREAMBLE_SIZE, 1, infile) != 1) {
                break;
            }
            atom_size = BE_64(&atom_bytes[0]);
            fseek(infile, atom_size - ATOM_PREAMBLE_SIZE * 2, SEEK_CUR);
        } else {
            fseek(infile, atom_size - ATOM_PREAMBLE_SIZE, SEEK_CUR);
        }
    }

    if (atom_type != MOOV_ATOM) {
        printf ("last atom in file was not a moov atom\n");
        fclose(infile);
        return 0;
    }

    /* moov atom was, in fact, the last atom in the chunk; load the whole
     * moov atom */
    fseek(infile, -atom_size, SEEK_END);
    last_offset = (uint64_t)ftell(infile);
    moov_atom_size = atom_size;
    moov_atom = malloc(moov_atom_size);
    if (!moov_atom) {
        printf ("could not allocate 0x%llX byte for moov atom\n",
            atom_size);
        fclose(infile);
        return 1;
    }
    if (fread(moov_atom, atom_size, 1, infile) != 1) {
        perror(argv[1]);
        free(moov_atom);
        fclose(infile);
        return 1;
    }

    /* this utility does not support compressed atoms yet, so disqualify
     * files with compressed QT atoms */
    if (BE_32(&moov_atom[12]) == CMOV_ATOM) {
        printf ("this utility does not support compressed moov atoms yet\n");
        free(moov_atom);
        fclose(infile);
        return 1;
    }

    /* close; will be re-opened later */
    fclose(infile);

    /* crawl through the moov chunk in search of stco or co64 atoms */
    for (i = 4; i < moov_atom_size - 4; i++) {
        atom_type = BE_32(&moov_atom[i]);
        if (atom_type == STCO_ATOM) {
            printf (" patching stco atom...\n");
            atom_size = BE_32(&moov_atom[i - 4]);
            if (i + atom_size - 4 > moov_atom_size) {
                printf (" bad atom size\n");
                free(moov_atom);
                return 1;
            }
            offset_count = BE_32(&moov_atom[i + 8]);
            for (j = 0; j < offset_count; j++) {
                current_offset = BE_32(&moov_atom[i + 12 + j * 4]);
                current_offset += moov_atom_size;
                moov_atom[i + 12 + j * 4 + 0] = (current_offset >> 24) & 0xFF;
                moov_atom[i + 12 + j * 4 + 1] = (current_offset >> 16) & 0xFF;
                moov_atom[i + 12 + j * 4 + 2] = (current_offset >>  8) & 0xFF;
                moov_atom[i + 12 + j * 4 + 3] = (current_offset >>  0) & 0xFF;
            }
            i += atom_size - 4;
        } else if (atom_type == CO64_ATOM) {
            printf (" patching co64 atom...\n");
            atom_size = BE_32(&moov_atom[i - 4]);
            if (i + atom_size - 4 > moov_atom_size) {
                printf (" bad atom size\n");
                free(moov_atom);
                return 1;
            }
            offset_count = BE_32(&moov_atom[i + 8]);
            for (j = 0; j < offset_count; j++) {
                current_offset = BE_64(&moov_atom[i + 12 + j * 8]);
                current_offset += moov_atom_size;
                moov_atom[i + 12 + j * 8 + 0] = (current_offset >> 56) & 0xFF;
                moov_atom[i + 12 + j * 8 + 1] = (current_offset >> 48) & 0xFF;
                moov_atom[i + 12 + j * 8 + 2] = (current_offset >> 40) & 0xFF;
                moov_atom[i + 12 + j * 8 + 3] = (current_offset >> 32) & 0xFF;
                moov_atom[i + 12 + j * 8 + 4] = (current_offset >> 24) & 0xFF;
                moov_atom[i + 12 + j * 8 + 5] = (current_offset >> 16) & 0xFF;
                moov_atom[i + 12 + j * 8 + 6] = (current_offset >>  8) & 0xFF;
                moov_atom[i + 12 + j * 8 + 7] = (current_offset >>  0) & 0xFF;
            }
            i += atom_size - 4;
        }
    }

    /* re-open the input file and open the output file */
    infile = fopen(argv[1], "rb");
    if (!infile) {
        perror(argv[1]);
        free(moov_atom);
        return 1;
    }
    outfile = fopen(argv[2], "wb");
    if (!outfile) {
        perror(argv[2]);
        fclose(outfile);
        free(moov_atom);
        return 1;
    }

    /* dump the new moov atom */
    printf (" writing moov atom...\n");
    if (fwrite(moov_atom, moov_atom_size, 1, outfile) != 1) {
        perror(argv[2]);
        goto error_out;
    }

    /* copy the remainder of the infile, from offset 0 -> last_offset - 1 */
    printf (" copying rest of file...\n");
    while (last_offset) {
        if (last_offset > COPY_BUFFER_SIZE)
            bytes_to_copy = COPY_BUFFER_SIZE;
        else
            bytes_to_copy = last_offset;

        if (fread(copy_buffer, bytes_to_copy, 1, infile) != 1) {
            perror(argv[1]);
            goto error_out;
        }
        if (fwrite(copy_buffer, bytes_to_copy, 1, outfile) != 1) {
            perror(argv[2]);
            goto error_out;
        }

        last_offset -= bytes_to_copy;
    }

    fclose(infile);
    fclose(outfile);
    free(moov_atom);

    return 0;

error_out:
    fclose(infile);
    fclose(outfile);
    free(moov_atom);
    return 1;
}

save it as qt-faststart.c and try again. You should know that this is outdated, but its still good if you cant get the ffmpeg one.


Adult Scripts: Adult Script Pro - Adult Search Script
Adult Advertising/Traffic: Plug Rush - EXOClick - PopAds

Offline

#9 2012-05-01 16:20:16

MS_DA
Member
Registered: 2011-04-26
Posts: 401
Website

Re: [HOWTO] Install PHP Upload Progress Extension for Adult Script Pro

Getting this now

-bash-3.2# gcc qt-faststart.c -o qt-faststart
qt-faststart.c:130:18: warning: no newline at end of file
qt-faststart.c: In function âmainâ:
qt-faststart.c:130: error: expected declaration or statement at end of input
qt-faststart.c:130: error: expected declaration or statement at end of input
-bash-3.2# gcc qt-faststart.c -o qt-faststart
qt-faststart.c:263:2: warning: no newline at end of file

Many Thanks!

Offline

#10 2012-05-02 08:08:20

MS_DA
Member
Registered: 2011-04-26
Posts: 401
Website

Re: [HOWTO] Install PHP Upload Progress Extension for Adult Script Pro

This qt-faststart.c  worked fine on my CentOS5.5 server

/*
 * qt-faststart.c, v0.1
 * by Mike Melanson (melanson@pcisys.net)
 * This file is placed in the public domain. Use the program however you
 * see fit.
 *
 * This utility rearranges a Quicktime file such that the moov atom
 * is in front of the data, thus facilitating network streaming.
 *
 * Compile this program using:
 *  cc qt-faststart.c -o qt-faststart
 * Invoke the program with:
 *  qt-faststart <infile.mov> <outfile.mov>
 *
 * Notes: Quicktime files can come in many configurations of top-level
 * atoms. This utility stipulates that the very last atom in the file needs
 * to be a moov atom. When given such a file, this utility will rearrange
 * the top-level atoms by shifting the moov atom from the back of the file
 * to the front, and patch the chunk offsets along the way. This utility
 * presently only operates on uncompressed moov atoms.
 */

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

#ifdef __MINGW32__
#define fseeko(x,y,z)  fseeko64(x,y,z)
#define ftello(x)      ftello64(x)
#endif

#define BE_16(x) ((((uint8_t*)(x))[0] << 8) | ((uint8_t*)(x))[1])
#define BE_32(x) ((((uint8_t*)(x))[0] << 24) | \
                  (((uint8_t*)(x))[1] << 16) | \
                  (((uint8_t*)(x))[2] << 8) | \
                   ((uint8_t*)(x))[3])
#define BE_64(x) (((uint64_t)(((uint8_t*)(x))[0]) << 56) | \
                  ((uint64_t)(((uint8_t*)(x))[1]) << 48) | \
                  ((uint64_t)(((uint8_t*)(x))[2]) << 40) | \
                  ((uint64_t)(((uint8_t*)(x))[3]) << 32) | \
                  ((uint64_t)(((uint8_t*)(x))[4]) << 24) | \
                  ((uint64_t)(((uint8_t*)(x))[5]) << 16) | \
                  ((uint64_t)(((uint8_t*)(x))[6]) << 8) | \
                  ((uint64_t)((uint8_t*)(x))[7]))

#define BE_FOURCC( ch0, ch1, ch2, ch3 )             \
        ( (uint32_t)(unsigned char)(ch3) |          \
        ( (uint32_t)(unsigned char)(ch2) << 8 ) |   \
        ( (uint32_t)(unsigned char)(ch1) << 16 ) |  \
        ( (uint32_t)(unsigned char)(ch0) << 24 ) )

#define QT_ATOM BE_FOURCC
/* top level atoms */
#define FREE_ATOM QT_ATOM('f', 'r', 'e', 'e')
#define JUNK_ATOM QT_ATOM('j', 'u', 'n', 'k')
#define MDAT_ATOM QT_ATOM('m', 'd', 'a', 't')
#define MOOV_ATOM QT_ATOM('m', 'o', 'o', 'v')
#define PNOT_ATOM QT_ATOM('p', 'n', 'o', 't')
#define SKIP_ATOM QT_ATOM('s', 'k', 'i', 'p')
#define WIDE_ATOM QT_ATOM('w', 'i', 'd', 'e')
#define PICT_ATOM QT_ATOM('P', 'I', 'C', 'T')
#define FTYP_ATOM QT_ATOM('f', 't', 'y', 'p')

#define CMOV_ATOM QT_ATOM('c', 'm', 'o', 'v')
#define STCO_ATOM QT_ATOM('s', 't', 'c', 'o')
#define CO64_ATOM QT_ATOM('c', 'o', '6', '4')

#define ATOM_PREAMBLE_SIZE 8
#define COPY_BUFFER_SIZE 1024

int main(int argc, char *argv[])
{
    FILE *infile;
    FILE *outfile;
    unsigned char atom_bytes[ATOM_PREAMBLE_SIZE];
    uint32_t atom_type = 0;
    uint64_t atom_size = 0;
    uint64_t last_offset;
    unsigned char *moov_atom;
    unsigned char *ftyp_atom = 0;
    uint64_t moov_atom_size;
    uint64_t ftyp_atom_size = 0;
    uint64_t i, j;
    uint32_t offset_count;
    uint64_t current_offset;
    uint64_t start_offset = 0;
    unsigned char copy_buffer[COPY_BUFFER_SIZE];
    int bytes_to_copy;

    if (argc != 3) {
        printf ("Usage: qt-faststart <infile.mov> <outfile.mov>\n");
        return 0;
    }

    infile = fopen(argv[1], "rb");
    if (!infile) {
        perror(argv[1]);
        return 1;
    }

    /* traverse through the atoms in the file to make sure that 'moov' is
     * at the end */
    while (!feof(infile)) {
        if (fread(atom_bytes, ATOM_PREAMBLE_SIZE, 1, infile) != 1) {
            break;
        }
        atom_size = (uint32_t)BE_32(&atom_bytes[0]);
        atom_type = BE_32(&atom_bytes[4]);

        if ((atom_type != FREE_ATOM) &&
            (atom_type != JUNK_ATOM) &&
            (atom_type != MDAT_ATOM) &&
            (atom_type != MOOV_ATOM) &&
            (atom_type != PNOT_ATOM) &&
            (atom_type != SKIP_ATOM) &&
            (atom_type != WIDE_ATOM) &&
            (atom_type != PICT_ATOM) &&
            (atom_type != FTYP_ATOM)) {
            printf ("encountered non-QT top-level atom (is this a Quicktime file?)\n");
            break;
        }

        /* keep ftyp atom */
        if (atom_type == FTYP_ATOM) {
            ftyp_atom_size = atom_size;
            ftyp_atom = malloc(ftyp_atom_size);
            if (!ftyp_atom) {
                printf ("could not allocate 0x%llX byte for ftyp atom\n",
                        atom_size);
                fclose(infile);
                return 1;
            }
            fseeko(infile, -ATOM_PREAMBLE_SIZE, SEEK_CUR);
            if (fread(ftyp_atom, atom_size, 1, infile) != 1) {
                perror(argv[1]);
                free(ftyp_atom);
                fclose(infile);
                return 1;
            }
            start_offset = ftello(infile);
            continue;
        }

        /* 64-bit special case */
        if (atom_size == 1) {
            if (fread(atom_bytes, ATOM_PREAMBLE_SIZE, 1, infile) != 1) {
                break;
            }
            atom_size = BE_64(&atom_bytes[0]);
            fseeko(infile, atom_size - ATOM_PREAMBLE_SIZE * 2, SEEK_CUR);
        } else {
            fseeko(infile, atom_size - ATOM_PREAMBLE_SIZE, SEEK_CUR);
        }
    }

    if (atom_type != MOOV_ATOM) {
        printf ("last atom in file was not a moov atom\n");
        fclose(infile);
        return 0;
    }

    /* moov atom was, in fact, the last atom in the chunk; load the whole
     * moov atom */
    fseeko(infile, -atom_size, SEEK_END);
    last_offset = ftello(infile);
    moov_atom_size = atom_size;
    moov_atom = malloc(moov_atom_size);
    if (!moov_atom) {
        printf ("could not allocate 0x%llX byte for moov atom\n",
            atom_size);
        fclose(infile);
        return 1;
    }
    if (fread(moov_atom, atom_size, 1, infile) != 1) {
        perror(argv[1]);
        free(moov_atom);
        fclose(infile);
        return 1;
    }

    /* this utility does not support compressed atoms yet, so disqualify
     * files with compressed QT atoms */
    if (BE_32(&moov_atom[12]) == CMOV_ATOM) {
        printf ("this utility does not support compressed moov atoms yet\n");
        free(moov_atom);
        fclose(infile);
        return 1;
    }

    /* close; will be re-opened later */
    fclose(infile);

    /* crawl through the moov chunk in search of stco or co64 atoms */
    for (i = 4; i < moov_atom_size - 4; i++) {
        atom_type = BE_32(&moov_atom[i]);
        if (atom_type == STCO_ATOM) {
            printf (" patching stco atom...\n");
            atom_size = BE_32(&moov_atom[i - 4]);
            if (i + atom_size - 4 > moov_atom_size) {
                printf (" bad atom size\n");
                free(moov_atom);
                return 1;
            }
            offset_count = BE_32(&moov_atom[i + 8]);
            for (j = 0; j < offset_count; j++) {
                current_offset = BE_32(&moov_atom[i + 12 + j * 4]);
                current_offset += moov_atom_size;
                moov_atom[i + 12 + j * 4 + 0] = (current_offset >> 24) & 0xFF;
                moov_atom[i + 12 + j * 4 + 1] = (current_offset >> 16) & 0xFF;
                moov_atom[i + 12 + j * 4 + 2] = (current_offset >>  8) & 0xFF;
                moov_atom[i + 12 + j * 4 + 3] = (current_offset >>  0) & 0xFF;
            }
            i += atom_size - 4;
        } else if (atom_type == CO64_ATOM) {
            printf (" patching co64 atom...\n");
            atom_size = BE_32(&moov_atom[i - 4]);
            if (i + atom_size - 4 > moov_atom_size) {
                printf (" bad atom size\n");
                free(moov_atom);
                return 1;
            }
            offset_count = BE_32(&moov_atom[i + 8]);
            for (j = 0; j < offset_count; j++) {
                current_offset = BE_64(&moov_atom[i + 12 + j * 8]);
                current_offset += moov_atom_size;
                moov_atom[i + 12 + j * 8 + 0] = (current_offset >> 56) & 0xFF;
                moov_atom[i + 12 + j * 8 + 1] = (current_offset >> 48) & 0xFF;
                moov_atom[i + 12 + j * 8 + 2] = (current_offset >> 40) & 0xFF;
                moov_atom[i + 12 + j * 8 + 3] = (current_offset >> 32) & 0xFF;
                moov_atom[i + 12 + j * 8 + 4] = (current_offset >> 24) & 0xFF;
                moov_atom[i + 12 + j * 8 + 5] = (current_offset >> 16) & 0xFF;
                moov_atom[i + 12 + j * 8 + 6] = (current_offset >>  8) & 0xFF;
                moov_atom[i + 12 + j * 8 + 7] = (current_offset >>  0) & 0xFF;
            }
            i += atom_size - 4;
        }
    }

    /* re-open the input file and open the output file */
    infile = fopen(argv[1], "rb");
    if (!infile) {
        perror(argv[1]);
        free(moov_atom);
        return 1;
    }

    if (start_offset > 0) { /* seek after ftyp atom */
        fseeko(infile, start_offset, SEEK_SET);
        last_offset -= start_offset;
    }

    outfile = fopen(argv[2], "wb");
    if (!outfile) {
        perror(argv[2]);
        fclose(outfile);
        free(moov_atom);
        return 1;
    }

    /* dump the same ftyp atom */
    if (ftyp_atom_size > 0) {
        printf (" writing ftyp atom...\n");
        if (fwrite(ftyp_atom, ftyp_atom_size, 1, outfile) != 1) {
            perror(argv[2]);
            goto error_out;
        }
    }

    /* dump the new moov atom */
    printf (" writing moov atom...\n");
    if (fwrite(moov_atom, moov_atom_size, 1, outfile) != 1) {
        perror(argv[2]);
        goto error_out;
    }

    /* copy the remainder of the infile, from offset 0 -> last_offset - 1 */
    printf (" copying rest of file...\n");
    while (last_offset) {
        if (last_offset > COPY_BUFFER_SIZE)
            bytes_to_copy = COPY_BUFFER_SIZE;
        else
            bytes_to_copy = last_offset;

        if (fread(copy_buffer, bytes_to_copy, 1, infile) != 1) {
            perror(argv[1]);
            goto error_out;
        }
        if (fwrite(copy_buffer, bytes_to_copy, 1, outfile) != 1) {
            perror(argv[2]);
            goto error_out;
        }

        last_offset -= bytes_to_copy;
    }

    fclose(infile);
    fclose(outfile);
    free(moov_atom);
    if (ftyp_atom_size > 0)
        free(ftyp_atom);

    return 0;

error_out:
    fclose(infile);
    fclose(outfile);
    free(moov_atom);
    if (ftyp_atom_size > 0)
        free(ftyp_atom);
    return 1;
}

Many Thanks for your help Adrian big_smile

Ben

Offline

Board footer

Powered by FluxBB