[Libva] Problem with HWDecode examples
Varun Dua
varundua007 at gmail.com
Mon Sep 20 23:39:57 PDT 2010
On Thu, Sep 16, 2010 at 10:33 AM, Varun Dua <varundua007 at gmail.com> wrote:
> Hi All
>
>
> I am using the hwdecode examples, they are building and running fine.
>
> I changed the file ffmpeg_video.c to make it decode a video. Below is the
> changed function that I am posting. The commented out portion is the
> original code. I changed that to make it work for decoding a video but it is
> giving a lot of artifacts.
>
> Please tell me what needs to done. I am not changing the surface_id or the
> context_id anywhere.
>
> ***********************************************
> ***********************************************
> int decode(void)
> {
> AVProbeData pd;
> ByteIOContext ioctx;
> AVInputFormat *format = NULL;
> AVFormatContext *ic = NULL;
> AVCodec *codec;
> AVCodecContext *avctx = NULL;
> AVPacket packet;
> AVStream *video_stream;
> int i, got_picture, error = -1;
>
> const uint8_t *video_data;
> unsigned int video_data_size;
>
> av_register_all();
> av_init_packet(&packet);
>
> /*codec_get_video_data(&video_data, &video_data_size);
> pd.filename = "";
> pd.buf = (uint8_t *)video_data;
> pd.buf_size = MIN(video_data_size, 32*1024);
> if (FORCE_VIDEO_FORMAT)
> format = av_find_input_format(FORCE_VIDEO_FORMAT);
> if (format == NULL && (format = av_probe_input_format(&pd, 1)) == NULL)
> goto end;
> format->flags |= AVFMT_NOFILE;
>
> if (init_put_byte(&ioctx, (uint8_t *)video_data, video_data_size, 0,
> NULL, NULL, NULL, NULL) < 0)
> goto end;
>
> if (av_open_input_stream(&ic, &ioctx, "", format, NULL) < 0)
> goto end;
> */
> av_open_input_file(&ic,"movies/high.mp4",NULL,0,NULL);
> if (av_find_stream_info(ic) < 0)
> goto end;
> dump_format(ic, 0, "", 0);
>
> video_stream = NULL;
> for (i = 0; i < ic->nb_streams; i++) {
> if (ic->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO &&
> !video_stream)
> video_stream = ic->streams[i];
> else
> ic->streams[i]->discard = AVDISCARD_ALL;
> }
> if (video_stream == NULL)
> goto end;
> avctx = video_stream->codec;
> if (ffmpeg_init_context(avctx) < 0)
> goto end;
>
> if ((codec = avcodec_find_decoder(avctx->codec_id)) == NULL)
> goto end;
> if (avcodec_open(avctx, codec) < 0)
> goto end;
>
> got_picture = 0;
> while (av_read_frame(ic, &packet) == 0) {
> if (packet.stream_index != video_stream->index)
> continue;
> if ((got_picture = ffmpeg_decode(avctx, packet.data, packet.size))
> < 0)
> goto end;
> /* read only one frame */
> if (got_picture) {
> error = 0;
> display();
> //break;
> }
> //av_free_packet()
> }
> /*if (!got_picture) {
> if ((got_picture = ffmpeg_decode(avctx, NULL, 0)) < 0)
> goto end;
> error = 0;
> }*/
>
> end:
> av_free_packet(&packet);
> if (avctx)
> avcodec_close(avctx);
> if (ic)
> av_close_input_stream(ic);
> return error;
> }
> ************************************************
> ************************************************
>
> Thanks for your help
> Regards
> Varun Dua
> Integ. M.Tech in Mathematics and Computing
> Mathematics Department
> IIT Delhi
>
>
>
Hi All
I figure that the problem is when there is motion in the frame. For static
images the code works fine, but when I do the same for a video it gives me
artifacts at the frames which have some motion in them. Please tell me where
I might be wrong.
Thanks
Varun Dua
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/libva/attachments/20100921/33db9609/attachment.html>
More information about the Libva
mailing list