/*
 * Flash Compatible Streaming Format common header.
 * Copyright (c) 2000 Fabrice Bellard
 * Copyright (c) 2003 Tinic Uro
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#ifndef AVFORMAT_SWF_H
#define AVFORMAT_SWF_H

#include "config.h"

#if CONFIG_ZLIB
#include <zlib.h>
#endif

#include "libavutil/fifo.h"
#include "avformat.h"
#include "avio.h"
#include "internal.h"

/* should have a generic way to indicate probable size */
#define DUMMY_FILE_SIZE   (100 * 1024 * 1024)
#define DUMMY_DURATION    600 /* in seconds */

enum {
    TAG_END                          =  0,
    TAG_SHOWFRAME                    =  1,
    TAG_DEFINESHAPE                  =  2,
    TAG_FREECHARACTER                =  3,
    TAG_PLACEOBJECT                  =  4,
    TAG_REMOVEOBJECT                 =  5,
    TAG_DEFINEBITS                   =  6,
    TAG_DEFINEBUTTON                 =  7,
    TAG_JPEGTABLES                   =  8,
    TAG_SETBACKGROUNDCOLOR           =  9,
    TAG_DEFINEFONT                   = 10,
    TAG_DEFINETEXT                   = 11,
    TAG_DOACTION                     = 12,
    TAG_DEFINEFONTINFO               = 13,
    TAG_DEFINESOUND                  = 14,
    TAG_STARTSOUND                   = 15,
    TAG_DEFINEBUTTONSOUND            = 17,
    TAG_STREAMHEAD                   = 18,
    TAG_STREAMBLOCK                  = 19,
    TAG_DEFINEBITSLOSSLESS           = 20,
    TAG_JPEG2                        = 21,
    TAG_DEFINESHAPE2                 = 22,
    TAG_DEFINEBUTTONCXFORM           = 23,
    TAG_PROTECT                      = 24,
    TAG_PLACEOBJECT2                 = 26,
    TAG_REMOVEOBJECT2                = 28,
    TAG_DEFINESHAPE3                 = 32,
    TAG_DEFINETEXT2                  = 33,
    TAG_DEFINEBUTTON2                = 34,
    TAG_DEFINEBITSJPEG3              = 35,
    TAG_DEFINEBITSLOSSLESS2          = 36,
    TAG_DEFINEEDITTEXT               = 37,
    TAG_DEFINESPRITE                 = 39,
    TAG_FRAMELABEL                   = 43,
    TAG_STREAMHEAD2                  = 45,
    TAG_DEFINEMORPHSHAPE             = 46,
    TAG_DEFINEFONT2                  = 48,
    TAG_EXPORTASSETS                 = 56,
    TAG_IMPORTASSETS                 = 57,
    TAG_ENABLEDEBUGGER               = 58,
    TAG_DOINITACTION                 = 59,
    TAG_VIDEOSTREAM                  = 60,
    TAG_VIDEOFRAME                   = 61,
    TAG_DEFINEFONTINFO2              = 62,
    TAG_ENABLEDEBUGGER2              = 64,
    TAG_SCRIPTLIMITS                 = 65,
    TAG_SETTABINDEX                  = 66,
    TAG_FILEATTRIBUTES               = 69,
    TAG_PLACEOBJECT3                 = 70,
    TAG_IMPORTASSETS2                = 71,
    TAG_DEFINEFONTALIGNZONES         = 73,
    TAG_CSMTEXTSETTINGS              = 74,
    TAG_DEFINEFONT3                  = 75,
    TAG_SYMBOLCLASS                  = 76,
    TAG_METADATA                     = 77,
    TAG_DEFINESCALINGGRID            = 78,
    TAG_DOABC                        = 82,
    TAG_DEFINESHAPE4                 = 83,
    TAG_DEFINEMORPHSHAPE2            = 84,
    TAG_DEFINESCENEANDFRAMELABELDATA = 86,
    TAG_DEFINEBINARYDATA             = 87,
    TAG_DEFINEFONTNAME               = 88,
    TAG_STARTSOUND2                  = 89,
    TAG_DEFINEBITSJPEG4              = 90,
    TAG_DEFINEFONT4                  = 91,
};

#define TAG_LONG         0x100

/* flags for shape definition */
#define FLAG_MOVETO      0x01
#define FLAG_SETFILL0    0x02
#define FLAG_SETFILL1    0x04

#define AUDIO_FIFO_SIZE 65536

/* character id used */
#define BITMAP_ID 0
#define VIDEO_ID 0
#define SHAPE_ID  1

typedef struct SWFContext {
    int64_t duration_pos;
    int64_t tag_pos;
    int64_t vframes_pos;
    int samples_per_frame;
    int sound_samples;
    int swf_frame_number;
    int video_frame_number;
    int frame_rate;
    int tag;
    AVFifoBuffer *audio_fifo;
    AVCodecContext *audio_enc, *video_enc;
    AVStream *video_st;
#if CONFIG_ZLIB
#define ZBUF_SIZE 4096
    AVIOContext *zpb;
    uint8_t *zbuf_in;
    uint8_t *zbuf_out;
    z_stream zstream;
#endif
} SWFContext;

extern const AVCodecTag ff_swf_codec_tags[];

#endif /* AVFORMAT_SWF_H */
