static int modplug_read_packet(AVFormatContext *s, AVPacket *pkt) { ModPlugContext *modplug = s->priv_data; if (modplug->video_stream) { modplug->video_switch ^= 1; // one video packet for one audio packet if (modplug->video_switch) { double var_values[VAR_VARS_NB]; var_values[VAR_W ] = modplug->w; var_values[VAR_H ] = modplug->h; var_values[VAR_TIME ] = modplug->packet_count * modplug->ts_per_packet; var_values[VAR_SPEED ] = ModPlug_GetCurrentSpeed (modplug->f); var_values[VAR_TEMPO ] = ModPlug_GetCurrentTempo (modplug->f); var_values[VAR_ORDER ] = ModPlug_GetCurrentOrder (modplug->f); var_values[VAR_PATTERN] = ModPlug_GetCurrentPattern(modplug->f); var_values[VAR_ROW ] = ModPlug_GetCurrentRow (modplug->f); if (av_new_packet(pkt, modplug->fsize) < 0) return AVERROR(ENOMEM); pkt->stream_index = 1; memset(pkt->data, 0, modplug->fsize); if (modplug->print_textinfo) { char intbuf[32]; PRINT_INFO(0, "speed", VAR_SPEED); PRINT_INFO(1, "tempo", VAR_TEMPO); PRINT_INFO(2, "order", VAR_ORDER); PRINT_INFO(3, "pattern", VAR_PATTERN); PRINT_INFO(4, "row", VAR_ROW); PRINT_INFO(5, "ts", VAR_TIME); } if (modplug->expr) { int x, y; for (y = 0; y < modplug->h; y++) { for (x = 0; x < modplug->w; x++) { double color; var_values[VAR_X] = x; var_values[VAR_Y] = y; color = av_expr_eval(modplug->expr, var_values, NULL); pkt->data[y*modplug->linesize + x*3 + 2] |= av_clip((int)color, 0, 0xf)<<4; } } } pkt->pts = pkt->dts = var_values[VAR_TIME]; pkt->flags |= AV_PKT_FLAG_KEY; return 0; } } if (av_new_packet(pkt, AUDIO_PKT_SIZE) < 0) return AVERROR(ENOMEM); if (modplug->video_stream) pkt->pts = pkt->dts = modplug->packet_count++ * modplug->ts_per_packet; pkt->size = ModPlug_Read(modplug->f, pkt->data, AUDIO_PKT_SIZE); if (pkt->size <= 0) { av_free_packet(pkt); return pkt->size == 0 ? AVERROR_EOF : AVERROR(EIO); } return 0; }
int sfMod::Mod::GetCurrentTempo() const { return ModPlug_GetCurrentTempo(file_); }