static VideoFilter* GreedyHDeintFilter(VideoFrameType inpixfmt, VideoFrameType outpixfmt, int *width, int *height, char *options, int threads) { ThisFilter *filter; (void) height; (void) options; (void) threads; filter = (ThisFilter *) malloc (sizeof(ThisFilter)); if (filter == NULL) { fprintf (stderr, "GreedyHDeint: failed to allocate memory for filter.\n"); return NULL; } filter->width = 0; filter->height = 0; memset(filter->frames, 0, sizeof(filter->frames)); filter->deint_frame = 0; AllocFilter(filter, *width, *height); init_yuv_conversion(); #ifdef MMX filter->mm_flags = av_get_cpu_flags(); TF_INIT(filter); #else filter->mm_flags = 0; #endif if (!(filter->mm_flags & (AV_CPU_FLAG_SSE|AV_CPU_FLAG_3DNOW|AV_CPU_FLAG_MMX))) { /* TODO plain old C implementation */ fprintf (stderr, "GreedyHDeint: Requires MMX extensions.\n"); CleanupGreedyHDeintFilter(&filter->vf); free(filter); return NULL; } filter->vf.filter = &GreedyHDeint; filter->vf.cleanup = &CleanupGreedyHDeintFilter; return (VideoFilter *) filter; }
AL_API ALvoid AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters) { ALCcontext *context; ALsizei cur = 0; context = GetContextRef(); if(!context) return; if(!(n >= 0)) alSetError(context, AL_INVALID_VALUE, "Generating %d filters", n); else for(cur = 0;cur < n;cur++) { ALfilter *filter = AllocFilter(context); if(!filter) { alDeleteFilters(cur, filters); break; } filters[cur] = filter->id; } ALCcontext_DecRef(context); }
static VideoFilter* GreedyHDeintFilter(VideoFrameType inpixfmt, VideoFrameType outpixfmt, int *width, int *height, char *options, int threads) { ThisFilter *filter; (void) height; (void) options; (void) threads; filter = (ThisFilter *) malloc (sizeof(ThisFilter)); if (filter == NULL) { fprintf (stderr, "GreedyHDeint: failed to allocate memory for filter.\n"); return NULL; } filter->width = 0; filter->height = 0; memset(filter->frames, 0, sizeof(filter->frames)); filter->deint_frame = 0; AllocFilter(filter, *width, *height); init_yuv_conversion(); #ifdef MMX filter->mm_flags = av_get_cpu_flags(); TF_INIT(filter); #else filter->mm_flags = 0; #endif filter->vf.filter = &GreedyHDeint; filter->vf.cleanup = &CleanupGreedyHDeintFilter; return (VideoFilter *) filter; }
static int GreedyHDeint (VideoFilter * f, VideoFrame * frame, int field) { ThisFilter *filter = (ThisFilter *) f; TF_VARS; int last_frame = 0; int cur_frame = 0; int bottom_field = 0; AllocFilter((ThisFilter*)f, frame->width, frame->height); if (filter->last_framenr != frame->frameNumber) { //this is no double call, really a new frame cur_frame = (filter->last_framenr + 1) & 1; last_frame = (filter->last_framenr) & 1; //check if really the previous frame (cause mythtv AutoDeInt behauviour) if (filter->last_framenr != (frame->frameNumber - 1)) { cur_frame = frame->frameNumber & 1; last_frame = cur_frame; } bottom_field = frame->top_field_first? 0 : 1; switch(frame->codec) { case FMT_YV12: //must convert from yv12 planar to yuv422 packed //only needed on first call for this frame yv12_to_yuy2( frame->buf + frame->offsets[0], frame->pitches[0], frame->buf + frame->offsets[1], frame->pitches[1], frame->buf + frame->offsets[2], frame->pitches[2], filter->frames[cur_frame], 2 * frame->width, frame->width, frame->height, 1 - frame->interlaced_frame); break; default: fprintf(stderr, "Unsupported pixel format.\n"); return 0; } } else { //double call cur_frame = (filter->last_framenr) & 1; last_frame = (filter->last_framenr + 1) & 1; bottom_field = frame->top_field_first? 1 : 0; } filter->got_frames[cur_frame] = 1; filter->frames_nr[cur_frame] = frame->frameNumber; //must be done for first frame or deinterlacing would use an "empty" memory block/frame if (!filter->got_frames[last_frame]) last_frame = cur_frame; #ifdef MMX /* SSE Version has best quality. 3DNOW and MMX a litte bit impure */ if (filter->mm_flags & AV_CPU_FLAG_SSE) { greedyh_filter_sse( filter->deint_frame, 2 * frame->width, filter->frames[cur_frame], filter->frames[last_frame], bottom_field, field, frame->width, frame->height); } else if (filter->mm_flags & AV_CPU_FLAG_3DNOW) { greedyh_filter_3dnow( filter->deint_frame, 2 * frame->width, filter->frames[cur_frame], filter->frames[last_frame], bottom_field, field, frame->width, frame->height); } else if (filter->mm_flags & AV_CPU_FLAG_MMX) { greedyh_filter_mmx( filter->deint_frame, 2 * frame->width, filter->frames[cur_frame], filter->frames[last_frame], bottom_field, field, frame->width, frame->height); } else #endif { /* TODO plain old C implementation */ (void) bottom_field; } #if 0 apply_chroma_filter(filter->deint_frame, frame->width * 2, frame->width, frame->height ); #endif /* convert back to yv12, cause myth only works with this format */ yuy2_to_yv12( filter->deint_frame, 2 * frame->width, frame->buf + frame->offsets[0], frame->pitches[0], frame->buf + frame->offsets[1], frame->pitches[1], frame->buf + frame->offsets[2], frame->pitches[2], frame->width, frame->height); filter->last_framenr = frame->frameNumber; return 0; }