1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * This file is part of FFmpeg.
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
5cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
6cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
7cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
8cabdff1aSopenharmony_ci *
9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12cabdff1aSopenharmony_ci * Lesser General Public License for more details.
13cabdff1aSopenharmony_ci *
14cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
15cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
16cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17cabdff1aSopenharmony_ci */
18cabdff1aSopenharmony_ci
19cabdff1aSopenharmony_ci#include <stdio.h>
20cabdff1aSopenharmony_ci#include <stdlib.h>
21cabdff1aSopenharmony_ci#include <inttypes.h>
22cabdff1aSopenharmony_ci#include <string.h>
23cabdff1aSopenharmony_ci#include "libavcodec/avcodec.h"
24cabdff1aSopenharmony_ci#include "libavutil/error.h"
25cabdff1aSopenharmony_ci
26cabdff1aSopenharmony_ci
27cabdff1aSopenharmony_ci
28cabdff1aSopenharmony_cistatic int setup_side_data_entry(AVPacket* avpkt)
29cabdff1aSopenharmony_ci{
30cabdff1aSopenharmony_ci    const uint8_t *data_name = NULL;
31cabdff1aSopenharmony_ci    int ret = 0, bytes;
32cabdff1aSopenharmony_ci    uint8_t *extra_data = NULL;
33cabdff1aSopenharmony_ci
34cabdff1aSopenharmony_ci
35cabdff1aSopenharmony_ci    /* get side_data_name string */
36cabdff1aSopenharmony_ci    data_name = av_packet_side_data_name(AV_PKT_DATA_NEW_EXTRADATA);
37cabdff1aSopenharmony_ci
38cabdff1aSopenharmony_ci    /* Allocate a memory bloc */
39cabdff1aSopenharmony_ci    bytes = strlen(data_name);
40cabdff1aSopenharmony_ci
41cabdff1aSopenharmony_ci    if(!(extra_data = av_malloc(bytes))){
42cabdff1aSopenharmony_ci        ret = AVERROR(ENOMEM);
43cabdff1aSopenharmony_ci        fprintf(stderr, "Error occurred: %s\n", av_err2str(ret));
44cabdff1aSopenharmony_ci        exit(1);
45cabdff1aSopenharmony_ci    }
46cabdff1aSopenharmony_ci    /* copy side_data_name to extra_data array */
47cabdff1aSopenharmony_ci    memcpy(extra_data, data_name, bytes);
48cabdff1aSopenharmony_ci
49cabdff1aSopenharmony_ci    /* create side data for AVPacket */
50cabdff1aSopenharmony_ci    ret = av_packet_add_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA,
51cabdff1aSopenharmony_ci                                        extra_data, bytes);
52cabdff1aSopenharmony_ci    if(ret < 0){
53cabdff1aSopenharmony_ci        fprintf(stderr,
54cabdff1aSopenharmony_ci                "Error occurred in av_packet_add_side_data: %s\n",
55cabdff1aSopenharmony_ci                av_err2str(ret));
56cabdff1aSopenharmony_ci    }
57cabdff1aSopenharmony_ci
58cabdff1aSopenharmony_ci    return ret;
59cabdff1aSopenharmony_ci}
60cabdff1aSopenharmony_ci
61cabdff1aSopenharmony_cistatic int initializations(AVPacket* avpkt)
62cabdff1aSopenharmony_ci{
63cabdff1aSopenharmony_ci    const static uint8_t* data = "selftest for av_packet_clone(...)";
64cabdff1aSopenharmony_ci    int ret = 0;
65cabdff1aSopenharmony_ci
66cabdff1aSopenharmony_ci    /* set values for avpkt */
67cabdff1aSopenharmony_ci    avpkt->pts = 17;
68cabdff1aSopenharmony_ci    avpkt->dts = 2;
69cabdff1aSopenharmony_ci    avpkt->data = (uint8_t*)data;
70cabdff1aSopenharmony_ci    avpkt->size = strlen(data);
71cabdff1aSopenharmony_ci    avpkt->flags = AV_PKT_FLAG_DISCARD;
72cabdff1aSopenharmony_ci    avpkt->duration = 100;
73cabdff1aSopenharmony_ci    avpkt->pos = 3;
74cabdff1aSopenharmony_ci
75cabdff1aSopenharmony_ci    ret = setup_side_data_entry(avpkt);
76cabdff1aSopenharmony_ci
77cabdff1aSopenharmony_ci    return ret;
78cabdff1aSopenharmony_ci}
79cabdff1aSopenharmony_ci
80cabdff1aSopenharmony_ciint main(void)
81cabdff1aSopenharmony_ci{
82cabdff1aSopenharmony_ci    AVPacket *avpkt = NULL;
83cabdff1aSopenharmony_ci    AVPacket *avpkt_clone = NULL;
84cabdff1aSopenharmony_ci    int ret = 0;
85cabdff1aSopenharmony_ci
86cabdff1aSopenharmony_ci    /* test av_packet_alloc */
87cabdff1aSopenharmony_ci    avpkt = av_packet_alloc();
88cabdff1aSopenharmony_ci    if(!avpkt) {
89cabdff1aSopenharmony_ci        av_log(NULL, AV_LOG_ERROR, "av_packet_alloc failed to allcoate AVPacket\n");
90cabdff1aSopenharmony_ci        return 1;
91cabdff1aSopenharmony_ci    }
92cabdff1aSopenharmony_ci
93cabdff1aSopenharmony_ci    if (initializations(avpkt) < 0) {
94cabdff1aSopenharmony_ci        printf("failed to initialize variables\n");
95cabdff1aSopenharmony_ci        av_packet_free(&avpkt);
96cabdff1aSopenharmony_ci        return 1;
97cabdff1aSopenharmony_ci    }
98cabdff1aSopenharmony_ci    /* test av_packet_clone*/
99cabdff1aSopenharmony_ci    avpkt_clone = av_packet_clone(avpkt);
100cabdff1aSopenharmony_ci
101cabdff1aSopenharmony_ci    if(!avpkt_clone) {
102cabdff1aSopenharmony_ci        av_log(NULL, AV_LOG_ERROR,"av_packet_clone failed to clone AVPacket\n");
103cabdff1aSopenharmony_ci        return 1;
104cabdff1aSopenharmony_ci    }
105cabdff1aSopenharmony_ci    /*test av_grow_packet*/
106cabdff1aSopenharmony_ci    if(av_grow_packet(avpkt_clone, 20) < 0){
107cabdff1aSopenharmony_ci        av_log(NULL, AV_LOG_ERROR, "av_grow_packet failed\n");
108cabdff1aSopenharmony_ci        return 1;
109cabdff1aSopenharmony_ci    }
110cabdff1aSopenharmony_ci    if(av_grow_packet(avpkt_clone, INT_MAX) == 0){
111cabdff1aSopenharmony_ci        printf( "av_grow_packet failed to return error "
112cabdff1aSopenharmony_ci                "when \"grow_by\" parameter is too large.\n" );
113cabdff1aSopenharmony_ci        ret = 1;
114cabdff1aSopenharmony_ci    }
115cabdff1aSopenharmony_ci    /* test size error check in av_new_packet*/
116cabdff1aSopenharmony_ci    if(av_new_packet(avpkt_clone, INT_MAX) == 0){
117cabdff1aSopenharmony_ci        printf( "av_new_packet failed to return error "
118cabdff1aSopenharmony_ci                "when \"size\" parameter is too large.\n" );
119cabdff1aSopenharmony_ci        ret = 1;
120cabdff1aSopenharmony_ci    }
121cabdff1aSopenharmony_ci    /*test size error check in av_packet_from_data*/
122cabdff1aSopenharmony_ci    if(av_packet_from_data(avpkt_clone, avpkt_clone->data, INT_MAX) == 0){
123cabdff1aSopenharmony_ci        printf("av_packet_from_data failed to return error "
124cabdff1aSopenharmony_ci                "when \"size\" parameter is too large.\n" );
125cabdff1aSopenharmony_ci        ret = 1;
126cabdff1aSopenharmony_ci    }
127cabdff1aSopenharmony_ci    /*clean up*/
128cabdff1aSopenharmony_ci    av_packet_free(&avpkt_clone);
129cabdff1aSopenharmony_ci    av_packet_free(&avpkt);
130cabdff1aSopenharmony_ci
131cabdff1aSopenharmony_ci
132cabdff1aSopenharmony_ci    return ret;
133cabdff1aSopenharmony_ci}
134