...that deal with pure data
You are not logged in.
Hi everybody,
I'm trying to write a pdp external using the libavcodec library, to expand the video decoding capabilities of the system. I'm following Stephen Dranger's tutorial (available at http://www.dranger.com/ffmpeg/) cause it's very well organized and clear. Still I'm not able to open video files inside pd, while the same piece of code works perfectly in the sample standalone program.
This is the code of my external:
#include <stdlib.h>
#include <stdio.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include "pdp.h"
typedef struct pdp_in_struct {
t_object x_obj;
t_outlet *x_outlet0;
int x_packet0, x_queue_id;
u32 x_width, x_height;
} t_pdp_in;
static void pdp_in_sendpacket(t_pdp_in *x)
{
/* unregister and propagate if valid dest packet */
pdp_packet_pass_if_valid(x->x_outlet0, &x->x_packet0);
}
static void pdp_in_process(t_pdp_in *x)
{
}
int pdp_in_open(t_pdp_in *x, t_symbol *s)
{
const char *filename = s->s_name;
AVFormatContext *pFormatCtx;
av_register_all();
// Open video file
if(av_open_input_file(&pFormatCtx, filename, NULL, 0, NULL)!=0)
{
post("Can't open file");
return -1; // Couldn't open file
}
// Retrieve stream information
if(av_find_stream_info(pFormatCtx)<0)
return -1; // Couldn't find stream information
// Dump information about file onto standard error
dump_format(pFormatCtx, 0, filename, 0);
return 0;
}
t_class *pdp_in_class;
void pdp_in_free(t_pdp_in *x)
{
t_pdp_procqueue *q = pdp_queue_get_queue();
pdp_procqueue_finish(q, x->x_queue_id);
pdp_packet_mark_unused(x->x_packet0);
}
void *pdp_in_new(void)
{
t_pdp_in *x = (t_pdp_in *)pd_new(pdp_in_class);
x->x_outlet0 = outlet_new(&x->x_obj, &s_anything);
x->x_packet0 = -1;
x->x_queue_id = -1;
x->x_width = -1;
x->x_height = -1;
return (void *)x;
}
#ifdef __cplusplus
extern "C"
{
#endif
void pdp_in_setup(void)
{
pdp_in_class = class_new(gensym("pdp_in"), (t_newmethod)pdp_in_new,
(t_method)pdp_in_free, sizeof(t_pdp_in), 0, A_DEFFLOAT, A_DEFFLOAT, A_NULL);
class_addmethod(pdp_in_class, (t_method)pdp_in_open, gensym("open"), A_SYMBOL, A_NULL);
}
#ifdef __cplusplus
}
#endifAm I missing something?
Thanks
Stefano
Offline
1) what is the problem line
2) what is the val of filename- check its correct
u need to investigate 1st a bit yourself cos here it looks like a random code dump to me :)
but i use similar code in libav and that works for me
Offline