+/*
+ * Process EA file header
+ * Returns 1 if the EA file is valid and successfully opened, 0 otherwise
+ */
+static int process_ea_header(AVFormatContext *s) {
+ uint32_t blockid, size = 0;
+ EaDemuxContext *ea = s->priv_data;
+ AVIOContext *pb = s->pb;
+ int i;
+
+ for (i=0; i<5 && (!ea->audio_codec || !ea->video_codec); i++) {
+ unsigned int startpos = avio_tell(pb);
+ int err = 0;
+
+ blockid = avio_rl32(pb);
+ size = avio_rl32(pb);
+ if (i == 0)
+ ea->big_endian = size > 0x000FFFFF;
+ if (ea->big_endian)
+ size = av_bswap32(size);
+
+ switch (blockid) {
+ case ISNh_TAG:
+ if (avio_rl32(pb) != EACS_TAG) {
+ av_log (s, AV_LOG_ERROR, "unknown 1SNh headerid\n");
+ return 0;
+ }
+ err = process_audio_header_eacs(s);
+ break;
+
+ case SCHl_TAG :
+ case SHEN_TAG :
+ blockid = avio_rl32(pb);
+ if (blockid == GSTR_TAG) {
+ avio_skip(pb, 4);
+ } else if ((blockid & 0xFFFF)!=PT00_TAG) {
+ av_log (s, AV_LOG_ERROR, "unknown SCHl headerid\n");
+ return 0;
+ }
+ err = process_audio_header_elements(s);
+ break;
+
+ case SEAD_TAG:
+ err = process_audio_header_sead(s);
+ break;
+
+ case MVIh_TAG :
+ err = process_video_header_cmv(s);
+ break;
+
+ case kVGT_TAG:
+ ea->video_codec = AV_CODEC_ID_TGV;
+ ea->time_base = (AVRational){1, 15};
+ break;
+
+ case mTCD_TAG :
+ err = process_video_header_mdec(s);
+ break;
+
+ case MPCh_TAG:
+ ea->video_codec = AV_CODEC_ID_MPEG2VIDEO;
+ break;
+
+ case pQGT_TAG:
+ case TGQs_TAG:
+ ea->video_codec = AV_CODEC_ID_TGQ;
+ break;
+
+ case pIQT_TAG:
+ ea->video_codec = AV_CODEC_ID_TQI;
+ break;
+
+ case MADk_TAG :
+ ea->video_codec = AV_CODEC_ID_MAD;
+ break;
+
+ case MVhd_TAG :
+ err = process_video_header_vp6(s);
+ break;
+ }
+
+ if (err < 0) {
+ av_log(s, AV_LOG_ERROR, "error parsing header: %i\n", err);
+ return err;
+ }
+
+ avio_seek(pb, startpos + size, SEEK_SET);
+ }
+
+ avio_seek(pb, 0, SEEK_SET);
+
+ return 1;
+}
+
+
+static int ea_probe(AVProbeData *p)
+{
+ switch (AV_RL32(&p->buf[0])) {
+ case ISNh_TAG:
+ case SCHl_TAG:
+ case SEAD_TAG:
+ case SHEN_TAG:
+ case kVGT_TAG:
+ case MADk_TAG:
+ case MPCh_TAG:
+ case MVhd_TAG:
+ case MVIh_TAG:
+ break;
+ default:
+ return 0;
+ }
+ if (AV_RL32(&p->buf[4]) > 0xfffff && AV_RB32(&p->buf[4]) > 0xfffff)
+ return 0;
+ return AVPROBE_SCORE_MAX;
+}
+
+static int ea_read_header(AVFormatContext *s)