[Libav-user] I have a question

alejandro ramirez yealexxx at gmail.com
Sun Jan 27 22:07:58 EET 2019


Hello guys I am working with video. I wan to encrypt the I-frames of one
video compressed in H.264. So I get the AVPacket from the video and compare
if (AVPacket.flags & AV_PKT_FLAG_KEY) to know if the packet has an I frame,
but when I try to print the AVPacket.data I don't have any information to
encrypt. Where can I get the information regarding to I-frame. ahead a put
my code, thank you.

#include <iostream>
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/avutil.h>
}
#define INBUF_SIZE 4096
//#define AV_INPUT_BUFFER_PADDING_SIZE 32
int main (int argc, char * argv[])
{
    //av_register_all();//omit
    //revisar el nĂºmero de argumentos en el video
    AVFormatContext *pFormatCtx = NULL;
    AVCodec *dec = NULL;
    AVCodecContext *pCodecCtx = NULL;
    AVStream *st = NULL;
    AVDictionary *opts = NULL;
    AVFrame *frame;
    AVPacket avpkt;
    uint8_t inbuf [INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
    FILE *f;
    int frame_count;
    int video_stream_index = -1;

    //av_init_packet (&avpkt);

    memset (inbuf + INBUF_SIZE, 0, AV_INPUT_BUFFER_PADDING_SIZE);
    if (avformat_open_input (&pFormatCtx, argv[1], NULL, NULL) != 0)
        return -1;
    if (avformat_find_stream_info (pFormatCtx, NULL) < 0)
        return -1;
    //video_stream_index = av_find_best_stream
(pFormatCtx,AVMEDIA_TYPE_VIDEO, -1, -1, &dec,0);
    video_stream_index = av_find_best_stream
(pFormatCtx,AVMEDIA_TYPE_VIDEO, -1, -1, &dec,0);
    if ( video_stream_index < 0)
        return -1;
    std::cout << "video_stream; " << video_stream_index << "\n";
    st = pFormatCtx -> streams [video_stream_index];
    std::cout << "number of frames " << st -> nb_frames << "\n";
    std::cout << "event_flags " << st -> event_flags << "\n";
    //pCodecCtx = st -> codec;//deprecated

    dec = avcodec_find_decoder (st -> codecpar -> codec_id);
    std::cout << "codec_id: " << st -> codecpar -> codec_id << "\n";
    std::cout << "AV_CODEC_ID_H264: " << AV_CODEC_ID_H264 << "\n";
    if (!dec)
        return -1;
    pCodecCtx = avcodec_alloc_context3 (dec);
    if (!pCodecCtx)
        return -1;
    //av_dict_set (&opts, "refcounted_frames", "0", 0);
    avcodec_parameters_to_context (pCodecCtx, st -> codecpar);


    std::cout << "todo bien \n";
    if (avcodec_open2 (pCodecCtx, dec, &opts) < 0)
        return -1;
    /*************hasta aqui buen
codigo*********************************************/
    frame = av_frame_alloc ();
    if (!frame)
        return -1;
    av_init_packet (&avpkt);
    avpkt.data = NULL;
    avpkt.size = 0;
    f = fopen (argv[1], "r");
    int times = 1;
    while (av_read_frame (pFormatCtx, &avpkt) >= 0){
        AVPacket oripkt = avpkt;
        if (oripkt.stream_index == video_stream_index){
            if (oripkt.flags & AV_PKT_FLAG_KEY){
                std::cout << "times: " << times ++ << "\n";
                std::cout << "avpkt.flags: " << oripkt.flags << "\n";
                std::cout << "tam avpkt.data: " << sizeof(oripkt.data) << "\n";
                std::cout << "tam avpkt.data: " << oripkt.data << "\n";
                std::cout << "oripkt.size: " << oripkt.size << "\n";
                std::cout << "oripkt.side_date_eme: " <<
oripkt.side_data_elems << "\n";
                if (!oripkt.data)
                    std::cout << "no tengo dinero \n";
            }
        }
    }

    std::cout << "Fin del programa " << "\n";
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20190127/9c40d093/attachment.html>


More information about the Libav-user mailing list