diff options
| author | Comment <tim@gray.(none)> | 2013-11-02 16:13:41 +0000 |
|---|---|---|
| committer | Comment <tim@gray.(none)> | 2013-11-02 16:13:41 +0000 |
| commit | 510a5218d5e981db3dde9ed31ddc6f732ed6a22a (patch) | |
| tree | b9d09c4dbdefed1ec693e0492841cde426ef6643 /rotord/src/graph.h | |
| parent | 8864f5da9649c176e472a7fb8913dd8114deec54 (diff) | |
| parent | eaccb1437465c6aa49e1d5511876852543e3b0fa (diff) | |
merge branch
Diffstat (limited to 'rotord/src/graph.h')
| -rw-r--r-- | rotord/src/graph.h | 63 |
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: |
