summaryrefslogtreecommitdiff
path: root/rotord/src/graph.h
diff options
context:
space:
mode:
Diffstat (limited to 'rotord/src/graph.h')
-rw-r--r--rotord/src/graph.h63
1 files changed, 62 insertions, 1 deletions
diff --git a/rotord/src/graph.h b/rotord/src/graph.h
index 6f2ee79..ddf2471 100644
--- a/rotord/src/graph.h
+++ b/rotord/src/graph.h
@@ -97,6 +97,34 @@ namespace Rotor {
class Thumbnailer{
public:
bool make(const string &inputfilename,int w,int h,const string &outputfilename) {
+ //first try svg
+ RsvgHandle * rsvg=rsvg_handle_new_from_file(inputfilename.c_str(),nullptr);
+ if (rsvg) {
+ RsvgDimensionData dims;
+ rsvg_handle_get_dimensions(rsvg,&dims);
+ cerr<<"Rotor: SVG loaded "<<inputfilename<<" , "<<dims.width<<"x"<<dims.height<<endl;
+ cv::Mat cp=cv::Mat::zeros(h,w,CV_8UC4);
+ cv::Mat co=cv::Mat(h,w,CV_8UC3);
+ cairo_surface_t * cs = cairo_image_surface_create_for_data (cp.data,
+ CAIRO_FORMAT_RGB24,
+ w,
+ h,
+ w*4);
+ cairo_t * cr = cairo_create (cs);
+ cairo_translate(cr, w/2, h/2);
+ cairo_scale(cr, ((float)w)/640.0f,((float)w)/640.0f);
+ cairo_translate(cr, -w/2, -h/2);
+ cairo_translate(cr, w/2-(dims.width/2), h/2-(dims.height/2));
+ rsvg_handle_render_cairo(rsvg,cr);
+ cv::cvtColor(cp,co,CV_RGBA2BGR,3);
+ cv::imwrite(outputfilename.c_str(),co);
+ cairo_destroy(cr);
+ cairo_surface_destroy(cs);
+ rsvg_handle_close(rsvg,nullptr);
+ //g_object_unref(rsvg);
+ return true;
+ }
+ //if not svg feed to FFMS2
if (player.open(inputfilename)){
if (player.fetch_frame(w,h,player.get_number_frames()/4)) {
Image i;
@@ -105,9 +133,42 @@ namespace Rotor {
cvtColor(i.rgb,cp,CV_RGB2BGR);
cv::imwrite(outputfilename.c_str(),cp);
return true;
-
}
}
+ //fall back to audio
+ libav::audio_decoder loader;
+ if (loader.open(inputfilename)) {
+ Audio_thumbnailer at;
+ at.width=w;
+ at.height=h;
+ int rate = loader.get_sample_rate();
+ int samples = loader.get_number_samples();
+ int channels= loader.get_number_channels();
+ int bits = loader.get_bit_depth();
+ at.init(channels,bits,samples,rate);
+ bool finished=false;
+ uint16_t *audio=new uint16_t[1024*loader.get_number_channels()];
+ uint64_t sample=0;
+ while (loader.get_samples(audio,sample,1024)) {
+ at.process_frame((uint8_t*)audio,1024);
+ sample+=1024;
+ }
+ cv::Mat co=cv::Mat(h,w,CV_8UC3);
+ uchar op;
+ for (int i=0;i<h;i++){
+ uchar* r=co.ptr(i); //pointer to row
+ for (int j=0;j<w;j++){
+ //audio rms in 0..1 range
+ if (at.audiodata[j]>abs(((float)i-h/2)/(h/2))) op=0xFF;
+ else op=0x00;
+ r[j*3]=op/4;
+ r[j*3+1]=op;
+ r[j*3+2]=op/4;
+ }
+ }
+ cv::imwrite(outputfilename.c_str(),co);
+ return true;
+ }
return false;
}
private: